Food Security Cluster Myanmar homepage


Summary of achievements

Beneficiaries of humanitarian action formed 90.57% of the 3,033,156 beneficiaries in the first quarter of 2022. The remainder were reached through development interventions.

To recall, the Food Security Cluster’s strategic objectives for 2022 are:

  • SO1: IDPs have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance)
  • SO2: Vulnerable persons (excl. IDPs) have equitable access to sufficient, safe and nutritious food (either in-kind or through food assistance)
  • SO3: Restore, protect and improve livelihoods and resilience

Overall, 91.12% of the food security cluster’s beneficiaries were from humanitarian activities.


2022 Q1 & Q2 humanitarian beneficiaries
SO Q1 Q2 Total total%
SO1 193,154 341,050 534,204 19.33
SO2 1,560,453 588,488 2,148,941 77.75
SO3 33,116 47,686 80,802 2.92
Total 1,786,723 977,224 2,763,947 100.00


A total of 8.88% beneficiaries were from development activities and actors.


2022 Q1 & Q2 development beneficiaries
SO Q1 Q2 Total total%
SO2 1,000 16 1,016 0.38
SO3 220,587 47,606 268,193 99.62
Total 221,587 47,622 269,209 100.00


Activities with significant increases in beneficiaries reached compared to Q1 include food/cash for work/assets, multi-purpose cash transfers and vocational training. New persons reached by farmer field school and farmer training dipped, likely due to the seasonality of the intervention. Encouragingly, the number of new persons reached by food distributions in Q2 was 83.08% as opposed to 85.81% in Q1, showing increasing investment in more durable solutions. Myanmar will likely face a prolonged food security crisis.


Beneficiaries by activity, Q1 & Q2 2022
Activity Q1 Q2 %_change Total
Food distribution 1,723,250 851,483 -50.59 2,574,733
FFS and farmer training 195,839 1,003 -99.49 196,842
Crop, vegetable and seed kits 48,046 60,912 26.78 108,958
Multi-purpose cash transfer 31,357 76,365 143.53 107,722
Food_cash for work_assets 7,352 26,362 258.57 33,714
Community infrastructure and equipment 0 4,770 0.00 4,770
IGA and small grants 2,048 462 -77.44 2,510
Heb and fortfied rice 0 1,706 0.00 1,706
Vocational training 327 1,306 299.39 1,633
Kitchen garden kits 0 475 0.00 475
Livestock kits 91 2 -97.80 93


Food distributions overwhelmingly target moderately-food-insecure persons in host and local communities, this group forms 75.04% of all beneficiaries of food distributions.


Food distributions by type food insecurity status and beneficiary type
beneficiary_type Moderate Severe Total
Host/local Community 1,913,480 18,655 1,932,135
Internally Displaced 260,257 182,793 443,050
Rakhine Stateless 3,618 189,405 193,023
Resettled 2,977 0 2,977
Returnees 2,413 1,135 3,548
Total 2,182,745 391,988 2,574,733


55% of beneficiaries were reached by activities where nutrition had been mainstreamed.


Beneficiaries by status of nutrition mainstreaming
was_nutrition_mainstreamed_in_activity SO1 SO2 SO3 total_beneficiaries %_beneficiaries
Yes 327,046 957,282 90,490 1,374,818 45.33
No 207,158 1,192,675 258,505 1,658,338 54.67




1. Geographies

1.1 States

Though new beneficiaries reached remained biased towards Yangon and Rakhine in Q2, figures were less skewed than they were in Q1. Overall 66.24% of beneficiaries in Q2 came from Yangon or Rakhine, whereas it was 78.83% in Q1. Kayah saw the largest quarter-to-quarter increase in number of beneficiaries.



A total of 123 townships have been reached across 16 states/regions.



1.2 Townships

The top 7 townships, each from Yangon or Rakhine contained 68% of all beneficiaries.


Top townships by beneficiaries reached
state township Q1 Q2 Total %total
Yangon Hlaingtharya (West) 433,074 36,195 469,269 15.47
Yangon Hlaingtharya (East) 270,646 128,461 399,107 13.16
Yangon Shwepyithar 380,512 0 380,512 12.55
Yangon North Okkalapa 168,400 172,559 340,959 11.24
Rakhine Buthidaung 147,534 18,314 165,848 5.47
Yangon Dala 81,125 81,390 162,515 5.36
Rakhine Sittwe 22,484 130,281 152,765 5.04
Kayah Loikaw 815 107,473 108,288 3.57
Mandalay Nyaung-U 71,547 0 71,547 2.36
Rakhine Maungdaw 44,625 22,757 67,382 2.22
Mandalay Myingyan 46,087 3 46,090 1.52
Kayin Hpapun 12,477 29,561 42,038 1.39
Kayah Hpruso 26,507 7,557 34,064 1.12
Kachin Waingmaw 19,249 14,292 33,541 1.11
Rakhine Pauktaw 76 31,597 31,673 1.04
Only showing townships with >1% of total beneficiaries


Comparing the food security cluster’s footprint in the first quarter, with that from the second quarter, new activity can be noted in Mandalay, Magway, Kayah and Kayin.


26 new townships were added in the second quarter of 2022, including 5 from Ayeyarwady and 3 each from Mandalay, Magway and Tanintharyi.



1.3 Locations

A location refers to either a village, ward, IDP site or industrial zone.

The vast amount of project locations have only one food security activity.



With some exceptions, the vast majority of project locations have only one partner present.



224 villages have more than one partner present. The table below breaks down the beneficiaries from these locations by activity and state.


Activities conducted in villages with more than one partner
state activity_red beneficiaries
Rakhine food distribution 287,278
Yangon food distribution 65,721
Magway FFS and farmer training 2,735
Rakhine crop, vegetable and seed kits 1,525
Kachin crop, vegetable and seed kits 698
Rakhine food_cash for work_assets 653
Shan (South) vocational training 504
Mon crop, vegetable and seed kits 365
Rakhine vocational training 66


The food security cluster’s partners can mostly be found in Yangon, Rakhine and Kachin.





2. Activities

2.1 Progress by activity

The first dotted red line shows the end of Q1 and the second shows the end of Q2. The thick line in grey shows the progress in 2021 for the same activity. It is observed that food distributions in 2022 greatly outpaced those in 2021. The same is also true for cash/work for food/assets and crop, vegetable and seed kits.



Newly implemented in Q2 of 2022 was the provision of HEB and fortified rice, largely in Chin state. Food distributions continued to be the largest activity, followed by the provision of crop, vegetable and seed kits.



2.2 Agricultural and livelihoods activities

The percentage of beneficiaries reached by agriculture and livelihoods activities (crops, vegetable and seed kits; FFS and farmer training; IGA and small grants; livestock kits) slightly in Q2 2022, compared to Q1.



The vast majority of beneficiaries of agricultural and livelihoods activities are recipients of farmer training and crop, vegetable and seed kits. It is possible that not all of Q2 was available for farmer training.




2.3 Delivery modalities

Only community infrastructure and equipment, HEB and fortified rice and kitchen garden kits were delivered entirely through in-kind modalities.


Percentage of beneficiaries reached by activity and delivery modality
Activity In-kind CBT/CVA Hybrid Service delivery Beneficiaries
Food distribution 86.1% 12.3% 1.6% 2,574,733
FFS and farmer training 15.0% 24.7% 60.3% 196,842
Crop, vegetable and seed kits 83.3% 0.5% 16.2% 0.0% 108,958
Multi-purpose cash transfer 89.3% 10.7% 107,722
Food_cash for work_assets 17.3% 82.7% 33,714
Community infrastructure and equipment 100.0% 4,770
IGA and small grants 10.4% 87.4% 1.2% 1.0% 2,510
Heb and fortfied rice 100.0% 1,706
Vocational training 0.0% 23.1% 76.9% 1,633
Kitchen garden kits 100.0% 475
Livestock kits 97.8% 0.0% 0.0% 2.2% 93


There are also clear differences between the different beneficiary types and the delivery modalities employed with them. Beneficiaries from host/local communities largely received in-kind distributions whilst those from camps and IDP sites mostly received cash-based interventions.



Areas with more IDPs, such as Sagaing, Rakhine and Kachin, reach most of their beneficiaries through cash-based programming.





3. Cash-based programming

3.1 USD per household

Compared to Q1, beneficiaries in Q2 are much less likely to have received cash transfers of less than USD 10 per household. The most common transfer values were between USD 60 and 70, an increase from the previous quarter.




3.3 USD per person

The boxplots above shows the range of cash transfer values (all values are per person, to facilitate comparability) by activity. The average for reach activity is marked by the thick line in the middle of each box. The leftmost and rightmost side of each box indicate the 25th and 75th percentile of transfer values, respectively. The length of each box is a gauge for how much variation there is in the transfer values of each activity.



Each of the bubbles represents an individual distribution, with their position along the x-axis showing the USD per person value of the distribution and the size of each bubble indicating the number of beneficiaries reached.

Food distributions tended to have the tightest range of values.



Cash transfer values tended to be higher in Q2 as compared to Q1 largely due to increases in the per-household package of multi-purpose cash transfers.




3.3 Food distributions


Kachin, Rakhine and Shan notably have several extreme outliers much higher than the average for that state. Kayin, however, has a very large number of beneficiaries who received less the USD 1/person. Distributions in Chin and Ayeyarwady had very consistent values as they were all implemented by the same implementing partner.

The table below compares the different bins for cash transfer values of food distributions with the minimum expenditure basket for food established by the Cash Working Group. They have established a floor of MMK 190,555 (or USD 114.55).

Overall, 1.86% of food distribution beneficiaries have received at least 100% of the MEB and 9.35% have received at least 50% of the MEB (USD 11.45 per person).


USD values of food distributions by percentage of MEB received
usd_person_bin avg_pc_of_meb avg_usd_month beneficiaries pc_of_hhd
<$2 5.39 1.23 20,923 4.76
>=$2_<$4 14.44 3.31 49,617 11.30
>=$4_<$6 21.38 4.90 30,454 6.93
>=$6_<$8 31.76 7.28 55,843 12.72
>=$8_<$10 39.62 9.08 82,235 18.73
>=$10_<$12 45.59 10.44 164,264 37.41
>=$12_<$14 54.39 12.46 6,219 1.42
>=$14_<$16 65.65 15.04 1,741 0.40
>=$16_<$18 74.95 17.17 6,941 1.58
>=$18_<$20 82.86 18.98 10,843 2.47
>=$20 143.54 32.89 10,066 2.29
Only persons reached through CBT/CVA/hybrid modalities are included



3.4 Implementing partners




4. Beneficiaries

4.1 Beneficiary types

In Q2 2022, 22.19% of beneficiaries were from host or local communities, in comparison to 53.31% for round 1. 11.27% of beneficiaries in Q2 were IDPs, compared to 6.38% for Q1.




4.2 Evidence of food insecurity status

Of the food security activities reported, very few provided details about the food insecurity status of beneficiaries. This makes it difficult ot determine whether interventions are truly reaching those most in need.

In general, the food insecurity status of the beneficiaries of multi-purpose cash transfers were much better documented than the statuses of those who received food distributions.


Mismatch between food insecurity status and activity (Q1 & Q2 2022)
activity food_insecurity_status beneficiaries %of_group
food distributions, moderate Food secure 31,713 1.45
food distributions, moderate Moderately food insecure 48,545 2.22
food distributions, moderate Severely food insecure 206,922 9.48
food distributions, moderate NA 1,895,565 86.84
food distributions, severe Food secure 13,601 3.47
food distributions, severe Moderately food insecure 13,644 3.48
food distributions, severe Severely food insecure 67,956 17.34
food distributions, severe NA 296,787 75.71
multi-purpose cash transfer, moderate Food secure 16,183 45.67
multi-purpose cash transfer, moderate Moderately food insecure 14,557 41.08
multi-purpose cash transfer, moderate NA 4,695 13.25
multi-purpose cash transfer, severe Food secure 41 0.06
multi-purpose cash transfer, severe Severely food insecure 72,230 99.92
multi-purpose cash transfer, severe NA 16 0.02


Evidence of beneficiaries’ food insecurity status provided to the cluster include:


Evidence of food insecurity status in Q1 & Q2 2022
evidence beneficiaries %_beneficiaries
No evidence 2,757,212 90.90
Armed conflict 147,088 4.85
community-based beneficiary selection 34,407 1.13
Post-distribution monitoring 31,347 1.03
Acceptable FCS 29,071 0.96
Beneficiary list and distribution list 19,279 0.64
Regular reporting 8,984 0.30
assessment, meeting minutes, payment 3,020 0.10
Village Profile 1,683 0.06
Based on Vulnerable Score (Vulnerable Criteria) 608 0.02
Food distribution certificate 308 0.01
Food Security and Livelihood Baseline Survey 119 0.00
Provision grants of women led micro business activities 30 0.00


The general lack of evidence of evidence of beneficiaries’ food insecurity status makes it difficult to justify to affected communities and donors that the Food Security Cluster is reaching the most in need. This highlights the need to promote a shared understanding of the response through the development of a common prioritisation tool for food security partners.




4.3 Beneficiary disaggregation

In this section, a test is applied to determine if the disaggregated numbers of beneficiaries reach have been copied and pasted – a somewhat common practice that sullies the quality of the data. To do this, the proportions of each disaggregation group by partner have been compared to how close they were to the mean for the entire group. To explain: if partner A reported that 40% of beneficiaries in an activity were adult females, this percentage was then compared to the average percentage of adult females for all other activities reported by that partner. This measure whether or not the same proportions were copied and pasted throughout the 5W form.

It is extremely unlikely that these percentages would be similar across activities as implementing partners worked in an average of 42 locations.

In the plot below, the closer a value is to 0% on the x-axis, the more likely it is that it was copied and pasted. It is estimated that 73% of beneficiary disaggregation values were copied and pasted.



Once the copy-pasted values are removed, this is the breakdown of beneficiaries by disaggregation group:





5. Partners

5.1 Implementing partner

There are 55 partners that were involved in direct implementation that have reported achievements in second quarter of 2022, in comparison with 44in the first quarter. These implementing partners corresponded to a total of 26 reporting organisations. The largest reporting organisation, 2690, had 24 implementing partners.


Reporting organisations with the most implementing partners
report_org_code implementing_partners
org_2690 24
org_3536 7
org_8415 7
org_2625 4
org_3422 4
org_2214 3
org_5369 3
All others had 1 or 2 implementing partners


The interactive plot below shows the number of beneficiaries and townships reached by implementing partner.

13 partners (21% of the total) have a presence in more than 5 townships. 8 partners are present in more than 10 townships.




5.2 Monthly progress by partner

Organisations 6197, 2690 and 5722 have implemented the majority of their activities in the second quarter of 2022. The thick grey line shows an organisation’s progress from last year.



The table below lists the top 15 partners by number of beneficiaries reached in 2022.


Top implementing partners by beneficiaries reached in 2022 (Q1 & Q2)
org_code ben_q1 rank_q1 ben_q2 rank_q2 total_ben
org_8540 380,478 1 4,502 25 384,980
org_5722 207,512 2 77,743 5 285,255
org_9693 122,397 6 78,569 4 200,966
org_4933 85,627 11 95,475 3 181,102
org_5440 116,142 7 52,944 10 169,086
org_6827 159,724 3 159,724
org_1206 156,433 4 156,433
org_2690 24,753 16 124,142 1 148,895
org_9566 89,365 10 57,723 9 147,088
org_3315 131,861 5 441 43 132,302
org_5677 95,835 9 23,473 13 119,308
org_6197 113,704 2 113,704
org_8004 69,918 12 40,490 11 110,408
org_6792 105,410 8 105,410
org_6130 35,385 15 61,280 8 96,665



5.3 Donors

The table below summarises the reach and scope (in terms of geographic extent and number of organisations supported) of donors who support at least two reporting organisations. FCDO and LIFT support the most expansive programmes.


Organisations supported and geographic reach by donor
donor report_orgs implementing_orgs states townships
FCDO 6 8 6 19
LIFT 6 10 6 15
MHF 5 6 4 7
ECHO 3 4 3 5
BHA 2 5 4 11
GIZ 2 2 2 7
org_5677 2 2 6 15
org_6793 2 3 3 9
org_7904 2 3 2 7
org_8415 2 2 3 15
Only showing donors supporting more than one reporting partner.


Sagaing, Shan (East) and Ayeyarwady have the fewest number of donors present.


Number of donors by state
state donors implementing_partners
Kayin 14 13
Kachin 13 14
Rakhine 11 18
Kayah 10 5
Mon 7 6
Shan (South) 7 8
Mandalay 5 3
Shan (North) 5 8
Bago (East) 4 3
Chin 4 4
Yangon 4 14
Magway 3 3
Tanintharyi 3 3
Ayeyarwady 2 4
Sagaing 2 3
Shan (East) 2 2


However, as shown by the table below, even though the majority of partners reported their donors, the omission of data from three key partners has resulted in the vast majority of reported beneficiaries not being associated with any donor.


Top donors by beneficiaries reached
donor beneficiaries %_beneficiaries
No donor specified 2,397,314 79.04
org_6793 156,303 5.15
FCDO 94,653 3.12
CERF 71,253 2.35
AICS 63,986 2.11
org_5677 49,279 1.62
BPRM 31,640 1.04
org_7904 20,213 0.67
DFAT 17,329 0.57
BHA 16,356 0.54
org_7002 13,851 0.46
AAP 12,392 0.41
MHF 12,303 0.41
NZMFAT 10,791 0.36
ECHO 7,854 0.26


Below is a table of beneficiaries who are missing donors, grouped by state.


Reported beneficiaries with missing donor data
state beneficiaries partners
Yangon 1,752,158 9
Rakhine 421,076 9
Kayah 98,394 1
Kachin 69,031 3
Shan (North) 18,420 5
Chin 16,389 2
Shan (South) 9,416 2
Sagaing 7,650 2
Kayin 4,505 2
Shan (East) 275 1




6. Comparison with targets

6.2 Reached vs target by township

The specifics of each township can be reviewed with the interactive plot below. Each point is a township, with the size indicating the number of beneficiaries. The x-axis indicates the target population by township and the y-axis shows the number of beneficiaries reached in Q1 and Q2 2022.

The red line down the middle represents reaching 100% of the target. Townships above this line have reached more beneficiaries than their target and townships below the line have not met their target yet. The further away a township is from the red line, the further above or below its target it is. Mouse over each of the townships to see more details.

The 13 townships along the extreme left side of the plot have beneficiaries but do not have targets (their targets have just been coded as 1 so that they show up on the plot). 209 townships with targets have not been reached.




6.2 Map of beneficiaries reached in Q1 & Q2 2022 vs target




6.3 Interactive reference table

There was an overallocation of resources in these relatively few areas in 2021 and this has continued in the first quarter of 2022. In the interactive table below, is a list of townships sorted by the gap between the targeted population and beneficiaries reached in 2022. Any of the columns can be sort; the search bars above each column can also assist in filtering.


LS0tDQp0aXRsZTogIlJlcG9ydCBvbiA1V3MiDQpzdWJ0aXRsZTogIlNlY29uZCBxdWFydGVyIDIwMjIiDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIyMDIyLTA3LTIxIg0Kb3V0cHV0Og0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIHRvYzogeWVzDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB5ZXMNCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQogICAgY29sbGFwc2VkOiBubw0KYWx3YXlzX2FsbG93X2h0bWw6IHllcw0KLS0tDQoNCmBgYHtjc3MsIGVjaG89RkFMU0V9DQoNCiNUT0M6OmJlZm9yZSB7DQogIGNvbnRlbnQ6ICIiOw0KICBkaXNwbGF5OiBibG9jazsNCiAgaGVpZ2h0OiA3MHB4Ow0KICBtYXJnaW46IDJlbSAyMHB4IDQwcHggMjBweDsNCiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJNeWFubWFyX2NsdXN0ZXJfYmx1ZS5wbmciKTsNCiAgYmFja2dyb3VuZC1zaXplOiBjb250YWluOw0KICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXIgY2VudGVyOw0KICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0Ow0KfQ0KYGBgDQoNCmBgYHs9aHRtbH0NCjxzdHlsZT4NCiAgICBib2R5IC5tYWluLWNvbnRhaW5lciB7DQogICAgICAgIG1heC13aWR0aDogMTI4MHB4Ow0KICAgIH0NCjwvc3R5bGU+DQpgYGANCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGx1YnJpZGF0ZSkNCmxpYnJhcnkoc3RyaW5naSkNCmxpYnJhcnkocGFuZGVyKQ0KbGlicmFyeShqYW5pdG9yKQ0KbGlicmFyeShmdXp6eWpvaW4pDQpsaWJyYXJ5KHNjYWxlcykNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KHNmKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeSh2aXJpZGlzKQ0KbGlicmFyeShza2ltcikNCmxpYnJhcnkocGxvdGx5KQ0KbGlicmFyeShwYXRjaHdvcmspDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkoaGVyZSkNCmxpYnJhcnkodGlkeXRleHQpDQpsaWJyYXJ5KGdnZm9yY2UpDQoNCnRoZW1lX3NldCh0aGVtZV9saWdodCgpKQ0KDQojIGRpc2FibGluZyBzY2llbnRpZmljIG5vdGF0aW9uDQpvcHRpb25zKHNjaXBlbiA9IDEwMCkNCg0KIyBwYW5kZXIgdGFibGVzIGFsbCBpbiBvbmUgcm93DQpwYW5kZXJPcHRpb25zKCd0YWJsZS5zcGxpdC50YWJsZScsIEluZikNCg0KIyBwYW5kZXIgdGhvdXNhbmRzIHNlcGFyYXRvcg0KcGFuZGVyT3B0aW9ucygiYmlnLm1hcmsiLCAiLCIpDQoNCiMgcmVwbGFjZSANCm9wdHMgPC0gb3B0aW9ucyhrbml0ci5rYWJsZS5OQSA9ICIiKQ0KDQpgJW91dCVgIDwtIE5lZ2F0ZShgJWluJWApDQoNCiMgZnVuY3Rpb24gZm9yIHRyYW5zcG9zaW5nIGRmDQp0cmFuc3Bvc2VfZGYgPC0gZnVuY3Rpb24oZGYpIHsNCiAgdF9kZiA8LSBkYXRhLnRhYmxlOjp0cmFuc3Bvc2UoZGYpDQogIGNvbG5hbWVzKHRfZGYpIDwtIHJvd25hbWVzKGRmKQ0KICByb3duYW1lcyh0X2RmKSA8LSBjb2xuYW1lcyhkZikNCiAgdF9kZiA8LSB0X2RmICU+JQ0KICAgIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKC5kYXRhID0gLikgJT4lDQogICAgdGliYmxlOjphc190aWJibGUoLikNCiAgcmV0dXJuKHRfZGYpDQp9DQoNCiMgZnVuY3Rpb24gYmVuZWZpY2lhcnkgc3VtbWFyaWVzDQpzdW1fYmVuIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyKXsNCiAgDQogIGNvbHVtbl92YXIgPC0gZW5xdW8oY29sdW1uX3ZhcikNCiAgDQogIGRmICU+JQ0KICAgIGdyb3VwX2J5KCEhY29sdW1uX3ZhcikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKSANCiAgICANCn0NCg0KIyBmdW5jdGlvbiBiZW5lZmljaWFyeSBzdW1tYXJpZXMsIDIgZ3JvdXBlZCB2YXJpYWJsZXMNCnN1bV9iZW4yIDwtIGZ1bmN0aW9uKGRmLCBjb2x1bW5fdmFyMSwgY29sdW1uX3ZhcjIpew0KICANCiAgY29sdW1uX3ZhcjEgPC0gZW5xdW8oY29sdW1uX3ZhcjEpDQogIGNvbHVtbl92YXIyIDwtIGVucXVvKGNvbHVtbl92YXIyKQ0KICANCiAgZGYgJT4lDQogICAgZ3JvdXBfYnkoISFjb2x1bW5fdmFyMSwgISFjb2x1bW5fdmFyMikgJT4lICMgbXVzdCBhZGQgYmFuZy1iYW5nDQogICAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSksIA0KICAgICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSANCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQpgYGANCg0KYGBge3IgZGF0YX0NCg0KZnNjIDwtIHJlYWRfY3N2KCIuL2RhdGEvZnNjLmNzdiIpIA0KDQpmc2NfMjAyMSA8LSByZWFkX2NzdigiLi9kYXRhL2ZzY18yMDIxLmNzdiIpDQoNCnBpbiA8LSByZWFkX2NzdigiLi9kYXRhL2ZzX3Bpbi5jc3YiKQ0KDQpoZF9saXN0IDwtIGZzYyAlPiUgDQogIGdyb3VwX2J5KGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCwgYWN0aXZpdHlfcmVkKSAlPiUNCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShoZCA9IGlmZWxzZShodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIgfA0KICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiwgDQogICAgICAgICAgICAgICAgICAgICAiSHVtYW5pdGFyaWFuIiwgDQogICAgICAgICAgICAgICAgICAgICAiRGV2ZWxvcG1lbnQiKSkgJT4lIA0KICBncm91cF9ieShoZCkgJT4lIA0KICBzdW1tYXJpc2VfYXQoImJlbmVmaWNpYXJpZXMiLCBzdW0pICU+JQ0KICBtdXRhdGUocGMgPSByb3VuZChiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKSkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiLi9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway9tbXJfcG9sYm5kYV9hZG0zX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JQ0KICByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkgJT4lIA0KIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RyX2RldGVjdCh0b3duc2hpcCwgIkhsYWluZ3RoYXJ5YSIpLCAiTU1SMDEzMDA4IiwgYWRtaW4zX3Bjb2RlKSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIi4vbW1yX3BvbGJuZGEyX2FkbTFfbWltdV8yNTBrL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway5zaHAiLCBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFKSAlPiUgc3RfYXNfc2YoKQ0KDQpgYGANCg0KDQpbRm9vZCBTZWN1cml0eSBDbHVzdGVyIE15YW5tYXIgaG9tZXBhZ2VdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvLykNCg0KPGJyPg0KDQoNCg0KIyMgU3VtbWFyeSBvZiBhY2hpZXZlbWVudHMNCg0KQmVuZWZpY2lhcmllcyBvZiBodW1hbml0YXJpYW4gYWN0aW9uIGZvcm1lZCBgciByb3VuZChmaWx0ZXIoZnNjLCBodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkh1bWFuaXRhcmlhbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMsIG5hLnJtID0gVFJVRSl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcywgbmEucm0gPSBUUlVFKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiB0aGUgYHIgc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIGJlbmVmaWNpYXJpZXMgaW4gdGhlIGZpcnN0IHF1YXJ0ZXIgb2YgMjAyMi4gVGhlIHJlbWFpbmRlciB3ZXJlIHJlYWNoZWQgdGhyb3VnaCBkZXZlbG9wbWVudCBpbnRlcnZlbnRpb25zLg0KDQpUbyByZWNhbGwsIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyBzdHJhdGVnaWMgb2JqZWN0aXZlcyBmb3IgMjAyMiBhcmU6DQoNCi0gICBTTzE6IElEUHMgaGF2ZSBlcXVpdGFibGUgYWNjZXNzIHRvIHN1ZmZpY2llbnQsIHNhZmUgYW5kIG51dHJpdGlvdXMgZm9vZCAoZWl0aGVyIGluLWtpbmQgb3IgdGhyb3VnaCBmb29kIGFzc2lzdGFuY2UpDQotICAgU08yOiBWdWxuZXJhYmxlIHBlcnNvbnMgKGV4Y2wuIElEUHMpIGhhdmUgZXF1aXRhYmxlIGFjY2VzcyB0byBzdWZmaWNpZW50LCBzYWZlIGFuZCBudXRyaXRpb3VzIGZvb2QgKGVpdGhlciBpbi1raW5kIG9yIHRocm91Z2ggZm9vZCBhc3Npc3RhbmNlKQ0KLSAgIFNPMzogUmVzdG9yZSwgcHJvdGVjdCBhbmQgaW1wcm92ZSBsaXZlbGlob29kcyBhbmQgcmVzaWxpZW5jZQ0KDQpPdmVyYWxsLCBgciBoZF9saXN0ICU+JSBmaWx0ZXIoaGQgPT0gIkh1bWFuaXRhcmlhbiIpICU+JSBwdWxsKHBjKWAlIG9mIHRoZSBmb29kIHNlY3VyaXR5IGNsdXN0ZXIncyBiZW5lZmljaWFyaWVzIHdlcmUgZnJvbSBodW1hbml0YXJpYW4gYWN0aXZpdGllcy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1zby1odW1hbml0YXJpYW59DQpmc2MgJT4lICANCiAgZmlsdGVyKGh1bWFuaXRhcmlhbl9vcl9kZXZlbG9wbWVudCA9PSAiSHVtYW5pdGFyaWFuIiB8IGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUgDQogIGdyb3VwX2J5KHNvLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gcXVhcnRlciwgDQogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lDQogIG11dGF0ZSh0b3RhbCA9IHExICsgcTIpICU+JSANCiAgcmVuYW1lX2FsbCguZnVucyA9IGxpc3Qoc3RyX3RvX3RpdGxlKSkgJT4lIA0KICByZW5hbWUoU08gPSBTbykgJT4lICANCiAgbXV0YXRlKHRvdGFsX3BjID0gVG90YWwgLyBzdW0oVG90YWwpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHRvdGFsX3BjKSwgfiByb3VuZCgueCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KFNPLCBRMSwgUTIsIA0KICAgICAgICAgVG90YWwsIGB0b3RhbCVgID0gdG90YWxfcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjIgUTEgJiBRMiBodW1hbml0YXJpYW4gYmVuZWZpY2lhcmllcyIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpLCANCiAgICAgICAgZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6NjAlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQoNCmBgYA0KDQo8YnI+DQoNCkEgdG90YWwgb2YgYHIgaGRfbGlzdCAlPiUgZmlsdGVyKGhkID09ICJEZXZlbG9wbWVudCIpICU+JSBwdWxsKHBjKWAlIGJlbmVmaWNpYXJpZXMgd2VyZSBmcm9tIGRldmVsb3BtZW50IGFjdGl2aXRpZXMgYW5kIGFjdG9ycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1zby1kZXZlbG9wbWVudH0NCg0KZnNjICU+JSAgDQogIGZpbHRlcihodW1hbml0YXJpYW5fb3JfZGV2ZWxvcG1lbnQgPT0gIkRldmVsb3BtZW50IiAmIGFjdGl2aXR5X3JlZCAhPSAiZm9vZCBkaXN0cmlidXRpb24iKSAlPiUgDQogIGdyb3VwX2J5KHNvLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gcXVhcnRlciwgDQogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgDQogICAgICAgICAgICAgIHZhbHVlc19maWxsID0gMCkgJT4lDQogIG11dGF0ZSh0b3RhbCA9IHExICsgcTIpICU+JSANCiAgcmVuYW1lX2FsbCguZnVucyA9IGxpc3Qoc3RyX3RvX3RpdGxlKSkgJT4lIA0KICByZW5hbWUoU08gPSBTbykgJT4lICANCiAgbXV0YXRlKHRvdGFsX3BjID0gVG90YWwgLyBzdW0oVG90YWwpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKHRvdGFsX3BjKSwgfiByb3VuZCgueCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgc2VsZWN0KFNPLCBRMSwgUTIsIA0KICAgICAgICAgVG90YWwsIGB0b3RhbCVgID0gdG90YWxfcGMpICU+JSANCiAgYWRvcm5fdG90YWxzKCJyb3ciKSAlPiUgIA0KICBrYWJsZShjYXB0aW9uID0gIjIwMjIgUTEgJiBRMiBkZXZlbG9wbWVudCBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIiksIA0KICAgICAgICBmb3JtYXQgPSAiaHRtbCIsIA0KICAgICAgICB0YWJsZS5hdHRyID0gInN0eWxlPSd3aWR0aDo2MCU7JyIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCg0KYGBgDQoNCjxicj4NCg0KYGBge3IgYWN0aXZpdHktbGlzdH0NCmFjdGl2aXR5X2xpc3QgPC0gZnNjICU+JSANCiAgc3VtX2JlbjIocXVhcnRlciwgYWN0aXZpdHlfcmVkKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KQWN0aXZpdGllcyB3aXRoIHNpZ25pZmljYW50IGluY3JlYXNlcyBpbiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgY29tcGFyZWQgdG8gUTEgaW5jbHVkZSBmb29kL2Nhc2ggZm9yIHdvcmsvYXNzZXRzLCBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzIGFuZCB2b2NhdGlvbmFsIHRyYWluaW5nLiBOZXcgcGVyc29ucyByZWFjaGVkIGJ5IGZhcm1lciBmaWVsZCBzY2hvb2wgYW5kIGZhcm1lciB0cmFpbmluZyBkaXBwZWQsIGxpa2VseSBkdWUgdG8gdGhlIHNlYXNvbmFsaXR5IG9mIHRoZSBpbnRlcnZlbnRpb24uIEVuY291cmFnaW5nbHksIHRoZSBudW1iZXIgb2YgbmV3IHBlcnNvbnMgcmVhY2hlZCBieSBmb29kIGRpc3RyaWJ1dGlvbnMgaW4gUTIgd2FzIGByIGFjdGl2aXR5X2xpc3QgJT4lIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIiAmIHF1YXJ0ZXIgPT0gInEyIikgJT4lIHB1bGwocGMpYCUgYXMgb3Bwb3NlZCB0byBgciBhY3Rpdml0eV9saXN0ICU+JSBmaWx0ZXIoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIgJiBxdWFydGVyID09ICJxMSIpICU+JSBwdWxsKHBjKWAlIGluIFExLCBzaG93aW5nIGluY3JlYXNpbmcgaW52ZXN0bWVudCBpbiBtb3JlIGR1cmFibGUgc29sdXRpb25zLiBNeWFubWFyIHdpbGwgbGlrZWx5IGZhY2UgYSBwcm9sb25nZWQgZm9vZCBzZWN1cml0eSBjcmlzaXMuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBncm91cF9ieShxdWFydGVyLCBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgIA0KICBwaXZvdF93aWRlcih2YWx1ZXNfZnJvbSA9IGJlbmVmaWNpYXJpZXMsIG5hbWVzX2Zyb20gPSBxdWFydGVyLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKGAlX2NoYW5nZWAgPSByb3VuZCgocTIgLSBxMSkgLyBxMSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYCVfY2hhbmdlYCA9IGlmZWxzZShpcy5pbmZpbml0ZShgJV9jaGFuZ2VgKSwgMCwgYCVfY2hhbmdlYCksIA0KICAgICAgICAgYWN0aXZpdHlfcmVkID0gaWZlbHNlKGFjdGl2aXR5X3JlZCAlaW4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhFQiBhbmQgZm9ydGlmaWVkIHJpY2UgZm9yIGFjdXRlIGVtZXJnZW5jaWVzIiksIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfdG9fc2VudGVuY2UoYWN0aXZpdHlfcmVkKSkpICU+JSANCiAgcmVuYW1lKFExID0gcTEsIFEyID0gcTIsIA0KICAgICAgICAgQWN0aXZpdHkgPSBhY3Rpdml0eV9yZWQpICU+JQ0KICBtdXRhdGUoVG90YWwgPSBRMSArIFEyKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhUb3RhbCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IGFjdGl2aXR5LCBRMSAmIFEyIDIwMjIiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQoNCg0KYGBgDQoNCjxicj4NCg0KYGBge3IgYmVuLXR5cGUtbGlzdH0NCmJlbl90eXBlX2xpc3QgPC0gZnNjICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdChhY3Rpdml0eSwgImZvb2QgZGlzdHJpYnV0aW9uIikpICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQpgYGANCg0KRm9vZCBkaXN0cmlidXRpb25zIG92ZXJ3aGVsbWluZ2x5IHRhcmdldCBtb2RlcmF0ZWx5LWZvb2QtaW5zZWN1cmUgcGVyc29ucyBpbiBob3N0IGFuZCBsb2NhbCBjb21tdW5pdGllcywgdGhpcyBncm91cCBmb3JtcyBgciBiZW5fdHlwZV9saXN0ICU+JSBmaWx0ZXIoYmVuZWZpY2lhcnlfdHlwZSA9PSAiSG9zdC9sb2NhbCBDb21tdW5pdHkiKSAlPiUgcHVsbChwYylgJSBvZiBhbGwgYmVuZWZpY2lhcmllcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMuDQoNCjxicj4NCg0KYGBge3IgZm9vZC1kaXN0cmlidXRpb25zLWZzLXN0YXR1c30NCg0KZnNjICU+JSANCiAgZmlsdGVyKHN0cl9kZXRlY3QoYWN0aXZpdHksICJmb29kIGRpc3RyaWJ1dGlvbiIpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5LCBiZW5lZmljaWFyeV90eXBlKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eSA9IHN0cl9leHRyYWN0KGFjdGl2aXR5LCAiXFwsIFxcdyskIiksIA0KICAgICAgICAgYWN0aXZpdHkgPSBzdHJfdG9fdGl0bGUoc3RyX3JlcGxhY2UoYWN0aXZpdHksICIsICIsICIiKSkpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBhY3Rpdml0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzLCB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgYWRvcm5fdG90YWxzKGMoInJvdyIsICJjb2wiKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkZvb2QgZGlzdHJpYnV0aW9ucyBieSB0eXBlIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgYW5kIGJlbmVmaWNpYXJ5IHR5cGUiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiKQ0KDQpgYGANCg0KPGJyPg0KDQo1NSUgb2YgYmVuZWZpY2lhcmllcyB3ZXJlIHJlYWNoZWQgYnkgYWN0aXZpdGllcyB3aGVyZSBudXRyaXRpb24gaGFkIGJlZW4gbWFpbnN0cmVhbWVkLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLW51dHJpdGlvbi1tYWluc3RyZWFtaW5nfQ0KZnNjICU+JSANCiAgbXV0YXRlKHNvID0gc3RyX3RvX3VwcGVyKHNvKSkgJT4lIA0KICBtdXRhdGUod2FzX251dHJpdGlvbl9tYWluc3RyZWFtZWRfaW5fYWN0aXZpdHkgPSBpZmVsc2UoaXMubmEod2FzX251dHJpdGlvbl9tYWluc3RyZWFtZWRfaW5fYWN0aXZpdHkpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyIsIHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5KSwgDQogICAgICAgICB3YXNfbnV0cml0aW9uX21haW5zdHJlYW1lZF9pbl9hY3Rpdml0eSA9IGZjdF9yZWxldmVsKHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5LCBsZXZlbHMgPSBjKCJZZXMiLCAiTm8iKSkpICU+JSANCiAgc3VtX2JlbjIoc28sIHdhc19udXRyaXRpb25fbWFpbnN0cmVhbWVkX2luX2FjdGl2aXR5KSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBzbywgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9iZW5lZmljaWFyaWVzID0gU08xICsgU08yICsgU08zLCANCiAgICAgICAgIGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQodG90YWxfYmVuZWZpY2lhcmllcyAvIHN1bSh0b3RhbF9iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJCZW5lZmljaWFyaWVzIGJ5IHN0YXR1cyBvZiBudXRyaXRpb24gbWFpbnN0cmVhbWluZyIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikNCiAgDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDEuIEdlb2dyYXBoaWVzDQoNCiMjIyAxLjEgU3RhdGVzDQoNCmBgYHtyIHN0YXRlLWxpc3R9DQpzdGF0ZV9saXN0IDwtIGZzYyAlPiUgDQogIHN1bV9iZW4yKHN0YXRlLCBxdWFydGVyKSAlPiUgDQogIGdyb3VwX2J5KHF1YXJ0ZXIpICU+JSANCiAgbXV0YXRlKHBjID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpDQoNCmBgYA0KDQpUaG91Z2ggbmV3IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCByZW1haW5lZCBiaWFzZWQgdG93YXJkcyBZYW5nb24gYW5kIFJha2hpbmUgaW4gUTIsIGZpZ3VyZXMgd2VyZSBsZXNzIHNrZXdlZCB0aGFuIHRoZXkgd2VyZSBpbiBRMS4gT3ZlcmFsbCBgciBzdGF0ZV9saXN0ICU+JSBmaWx0ZXIocXVhcnRlciA9PSAicTIiICYgc3RhdGUgJWluJSBjKCJZYW5nb24iLCAiUmFraGluZSIpKSAlPiUgc3VtbWFyaXNlX2F0KCJwYyIsIHN1bSkgJT4lIHB1bGwocGMpYCUgb2YgYmVuZWZpY2lhcmllcyBpbiBRMiBjYW1lIGZyb20gWWFuZ29uIG9yIFJha2hpbmUsIHdoZXJlYXMgaXQgd2FzIGByIHN0YXRlX2xpc3QgJT4lIGZpbHRlcihxdWFydGVyID09ICJxMSIgJiBzdGF0ZSAlaW4lIGMoIllhbmdvbiIsICJSYWtoaW5lIikpICU+JSBzdW1tYXJpc2VfYXQoInBjIiwgc3VtKSAlPiUgcHVsbChwYylgJSBpbiBRMS4gS2F5YWggc2F3IHRoZSBsYXJnZXN0IHF1YXJ0ZXItdG8tcXVhcnRlciBpbmNyZWFzZSBpbiBudW1iZXIgb2YgYmVuZWZpY2lhcmllcy4NCg0KPGJyPg0KDQpgYGB7ciBmYWNldC1zdGF0ZS1xdWFydGVyLCBmaWcuaGVpZ2h0ID0gNi41fQ0KcTFfYWRtaW4zIDwtIGZzYyAlPiUgDQogIGZpbHRlcihxdWFydGVyID09ICJxMSIpICU+JSANCiAgZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSAlPiUgDQogIGFzLmxpc3QoKQ0KDQoNCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocXVhcnRlciA9IHJlY29kZShxdWFydGVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInExIiA9ICJRdWFydGVyXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInEyIiA9ICJRdWFydGVyXzIiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzLCB5ID0gZmN0X3Jlb3JkZXIoc3RhdGUsIGJlbmVmaWNpYXJpZXMpKSkgKyANCiAgZ2VvbV9jb2woYWVzKGZpbGwgPSBzdGF0ZSkpICsgDQogIGZhY2V0X3Jvdyh2YXJzKHF1YXJ0ZXIpLCBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZSIpICsgDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBudW1iZXJfZm9ybWF0KHNjYWxlID0gMSAvIDEwMDAsIHN1ZmZpeCA9ICJLIikpICsgDQogIGd1aWRlcyhmaWxsID0gIm5vbmUiKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIGhqdXN0ID0gImlud2FyZCIsIHNpemUgPSAzLjUpICsgDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgcXVhcnRlciIpICsgDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KQSB0b3RhbCBvZiBgciBkaXN0aW5jdChmc2MsIGFkbWluM19wY29kZSkgJT4lIG5yb3coKWAgdG93bnNoaXBzIGhhdmUgYmVlbiByZWFjaGVkIGFjcm9zcyBgciBkaXN0aW5jdChmc2MsIGFkbWluMV9wY29kZSkgJT4lIG5yb3coKWAgc3RhdGVzL3JlZ2lvbnMuDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgVG93bnNoaXBzDQoNCmBgYHtyIHRvcC10b3duc2hpcHMtcGMsIGluY2x1ZGU9RkFMU0V9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXApICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShwYyA9IGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjKSkgJT4lIA0KICBmaWx0ZXIoYmVuZWZpY2lhcmllcyA+IDE1MDAwMCkgJT4lIA0KICB7c3VtKC4kcGMpfQ0KYGBgDQoNClRoZSB0b3AgNyB0b3duc2hpcHMsIGVhY2ggZnJvbSBZYW5nb24gb3IgUmFraGluZSBjb250YWluZWQgNjglIG9mIGFsbCBiZW5lZmljaWFyaWVzLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLXRvcC10b3duc2hpcHN9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgbmFtZXNfZnJvbSA9IHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICB2YWx1ZXNfZmlsbCA9IDApICU+JSANCiAgbXV0YXRlKHRvdGFsID0gcTEgKyBxMiwgDQogICAgICAgICBwY190b3RhbCA9IHRvdGFsIC8gc3VtKHRvdGFsKSkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhtYXRjaGVzKCJwYyIpKSwgfiByb3VuZCgueCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKHBjX3RvdGFsKSkgJT4lIA0KICBmaWx0ZXIocGNfdG90YWwgPj0gMSkgJT4lIA0KICBzZWxlY3Qoc3RhdGUsIHRvd25zaGlwLCBRMSA9IHExLCBRMiA9IHEyLCANCiAgICAgICAgIFRvdGFsID0gdG90YWwsIGAldG90YWxgID0gcGNfdG90YWwpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIlRvcCB0b3duc2hpcHMgYnkgYmVuZWZpY2lhcmllcyByZWFjaGVkIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIikgJT4lIA0KICBmb290bm90ZSgiT25seSBzaG93aW5nIHRvd25zaGlwcyB3aXRoID4xJSBvZiB0b3RhbCBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNCkNvbXBhcmluZyB0aGUgZm9vZCBzZWN1cml0eSBjbHVzdGVyJ3MgZm9vdHByaW50IGluIHRoZSBmaXJzdCBxdWFydGVyLCB3aXRoIHRoYXQgZnJvbSB0aGUgc2Vjb25kIHF1YXJ0ZXIsIG5ldyBhY3Rpdml0eSBjYW4gYmUgbm90ZWQgaW4gTWFuZGFsYXksIE1hZ3dheSwgS2F5YWggYW5kIEtheWluLg0KDQpgYGB7ciBtYXBzLWJlbi1xdWFydGVyLCBmaWcuaGVpZ2h0PTl9DQpmc2MgJT4lIA0KICBmaWx0ZXIocXVhcnRlciA9PSAicTEiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDMtMzEiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICsgDQogIA0KZnNjICU+JSANCiAgIyBmaWx0ZXIocXVhcnRlciA9PSAicTIiKSAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9IGMoImFkbWluM19wY29kZV9vbGQiID0gImFkbWluM19wY29kZSIpKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArIA0KICBnZW9tX3NmKGFlcyhmaWxsID0gYmVuZWZpY2lhcmllcyksIHNpemUgPSAuMSkgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIHRyYW5zID0gImxvZzEwIiwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwgDQogICAgICAgIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLCANCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCguNywgImNtIiksIA0KICAgICAgICBwbG90LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICJ3aGl0ZSIsIGNvbG91ciA9ICJ3aGl0ZSIpKSArIA0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIGFzIG9mIDIwMjItMDYtMzAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJUb3duc2hpcHMgaW4gZ3JleSBkbyBub3QgaGF2ZSBhbnkgcGFydG5lcnMgcHJlc2VudCIsIA0KICAgICAgIGZpbGwgPSAiQmVuZWZpY2lhcmllcyIpICANCg0KIyBnZ3NhdmUoIi4vbWFwc19xMV9xMi5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDksIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+DQoNCjI2IG5ldyB0b3duc2hpcHMgd2VyZSBhZGRlZCBpbiB0aGUgc2Vjb25kIHF1YXJ0ZXIgb2YgMjAyMiwgaW5jbHVkaW5nIDUgZnJvbSBBeWV5YXJ3YWR5IGFuZCAzIGVhY2ggZnJvbSBNYW5kYWxheSwgTWFnd2F5IGFuZCBUYW5pbnRoYXJ5aS4NCg0KPGJyPjxicj4NCg0KIyMjIDEuMyBMb2NhdGlvbnMNCg0KQSBsb2NhdGlvbiByZWZlcnMgdG8gZWl0aGVyIGEgdmlsbGFnZSwgd2FyZCwgSURQIHNpdGUgb3IgaW5kdXN0cmlhbCB6b25lLg0KDQpUaGUgdmFzdCBhbW91bnQgb2YgcHJvamVjdCBsb2NhdGlvbnMgaGF2ZSBvbmx5IG9uZSBmb29kIHNlY3VyaXR5IGFjdGl2aXR5Lg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIGFjdGl2aXRpZXMgPSBuX2Rpc3RpbmN0KGFjdGl2aXR5KSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0aWVzID0gaWZlbHNlKGFjdGl2aXRpZXMgPj0gMywgIj49MyIsIGFjdGl2aXRpZXMpLCANCiAgICAgICAgIGFjdGl2aXRpZXMgPSBmY3RfcmVsZXZlbChhY3Rpdml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCIxIiwgIjIiLCAiPj0zIikpLA0KICAgICAgICAgYWN0aXZpdGllcyA9IHJlY29kZShhY3Rpdml0aWVzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiID0gIjFfYWN0aXZpdHkiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIiID0gIjJfYWN0aXZpdGllcyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0zIiA9ICI+PTNfYWN0aXZpdGllcyIpLCkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBiZW5lZmljaWFyaWVzKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEsIHRyYW5zID0gImxvZzEwIikgKyANCiAgZmFjZXRfd3JhcCh+IGFjdGl2aXRpZXMpICsgDQogIGxhYnMoeSA9ICJOdW1iZXIgb2YgbG9jYXRpb25zIiwgDQogICAgICAgeCA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyBieSBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGxvY2F0aW9uLCBmYWNldGVkIGJ5IG51bWJlciBvZiBhY3Rpdml0aWVzIikgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTAsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQpgYGANCg0KPGJyPg0KDQpXaXRoIHNvbWUgZXhjZXB0aW9ucywgdGhlIHZhc3QgbWFqb3JpdHkgb2YgcHJvamVjdCBsb2NhdGlvbnMgaGF2ZSBvbmx5IG9uZSBwYXJ0bmVyIHByZXNlbnQuDQoNCjxicj4NCg0KYGBge3IgaGlzdG9ncmFtLXBhcm50ZXJzLWxvY2F0aW9ufQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShsb2NhdGlvbikpICU+JSANCiAgZ3JvdXBfYnkobG9jYXRpb24sIHRvd25zaGlwLCBsb2NhdGlvbl90eXBlKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgICAgIHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBmaWx0ZXIobG9jYXRpb25fdHlwZSAhPSAiSW5kdXN0cmlhbCB6b25lIikgJT4lIA0KICMgbXV0YXRlKHBhcnRuZXJzID0gaWZlbHNlKHBhcnRuZXJzID49IDMsICI+PTMiLCBwYXJ0bmVycyksIA0KICMgICAgICAgIHBhcnRuZXJzID0gZmN0X3JlbGV2ZWwocGFydG5lcnMsIA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCIxIiwgIjIiLCAiPj0zIikpLA0KICMgICAgICAgIHBhcnRuZXJzID0gcmVjb2RlKHBhcnRuZXJzLCANCiAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICIxIiA9ICIxX2FjdGl2aXR5IiwgDQogIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMiIgPSAiMl9wYXJ0bmVycyIsIA0KICMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49MyIgPSAiPj0zX3BhcnRuZXJzIiksKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHBhcnRuZXJzLCBmaWxsID0gbG9jYXRpb25fdHlwZSkpICsgDQogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKyANCiAgc3RhdF9iaW4oYmlud2lkdGggPSAxLCBnZW9tID0gInRleHQiLCBzaXplID0gMywgDQogICAgICAgICAgIGFlcyhsYWJlbCA9IC4uY291bnQuLiksIA0KICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX3N0YWNrKHZqdXN0ID0gMC45KSkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0YxQzQwRiIsICIjMUFCQzlDIiwgIiNFQzcwNjMiKSkgKw0KICBmYWNldF93cmFwKH4gbG9jYXRpb25fdHlwZSkgKyANCiAgbGFicyh5ID0gIk51bWJlciBvZiBsb2NhdGlvbnMiLCANCiAgICAgICB4ID0gIk51bWJlciBvZiBwYXJ0bmVycyBieSBsb2NhdGlvbiIsIA0KICAgICAgIHRpdGxlID0gIkJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIGJ5IGxvY2F0aW9uLCBmYWNldGVkIGJ5IG51bWJlciBvZiBwYXJ0bmVycyIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKQ0KYGBgDQoNCjxicj4NCg0KMjI0IHZpbGxhZ2VzIGhhdmUgbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIHByZXNlbnQuIFRoZSB0YWJsZSBiZWxvdyBicmVha3MgZG93biB0aGUgYmVuZWZpY2lhcmllcyBmcm9tIHRoZXNlIGxvY2F0aW9ucyBieSBhY3Rpdml0eSBhbmQgc3RhdGUuDQoNCjxicj4NCg0KYGBge3IgdGFibGUtbW9yZS10aGFuLW9uZS1wYXJ0bmVyfQ0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEobG9jYXRpb24pKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCB0b3duc2hpcCwgc3RhdGUsIGxvY2F0aW9uX3R5cGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpLCANCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JSANCiAgZmlsdGVyKGxvY2F0aW9uX3R5cGUgPT0gIlZpbGxhZ2UiICYgDQogICAgICAgICAgIHBhcnRuZXJzID49IDIpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUsIGFjdGl2aXR5X3JlZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JQ0KICBrYWJsZShjYXB0aW9uID0gIkFjdGl2aXRpZXMgY29uZHVjdGVkIGluIHZpbGxhZ2VzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0bmVyIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgZm9vZCBzZWN1cml0eSBjbHVzdGVyJ3MgcGFydG5lcnMgY2FuIG1vc3RseSBiZSBmb3VuZCBpbiBZYW5nb24sIFJha2hpbmUgYW5kIEthY2hpbi4NCg0KPGJyPg0KDQpgYGB7ciBsb2NhdGlvbnMtcGFydG5lcnMtc3RhdGV9DQpmc2MgJT4lIA0KICBncm91cF9ieShzdGF0ZSwgdG93bnNoaXAsIGxvY2F0aW9uX3R5cGUpICU+JSANCiAgc3VtbWFyaXNlKHBhcnRuZXJzID0gbl9kaXN0aW5jdChvcmdfY29kZSkpICU+JQ0KICBmaWx0ZXIobG9jYXRpb25fdHlwZSAhPSAiSW5kdXN0cmlhbCB6b25lIikgJT4lIA0KICBtdXRhdGUobWVhbl9wYXJ0bmVycyA9IG1lYW4ocGFydG5lcnMsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGFydG5lcnMsIHkgPSBmY3RfcmV2KHN0YXRlKSwgZmlsbCA9IGxvY2F0aW9uX3R5cGUpKSArDQogIGdlb21fY29sKCkgKw0KICBmYWNldF93cmFwKH4gbG9jYXRpb25fdHlwZSkgKyANCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI0YxQzQwRiIsICIjMUFCQzlDIiwgIiNFQzcwNjMiKSkgKw0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgbGFicyh4ID0gIk51bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMiLCB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIk51bWJlciBvZiBpbXBsZW1lbnRpbmcgcGFydG5lcnMgYnkgc3RhdGUgYW5kIGxvY2F0aW9uIHR5cGUiKQ0KICANCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMi4gQWN0aXZpdGllcw0KDQojIyMgMi4xIFByb2dyZXNzIGJ5IGFjdGl2aXR5DQoNClRoZSBmaXJzdCBkb3R0ZWQgcmVkIGxpbmUgc2hvd3MgdGhlIGVuZCBvZiBRMSBhbmQgdGhlIHNlY29uZCBzaG93cyB0aGUgZW5kIG9mIFEyLiBUaGUgdGhpY2sgbGluZSBpbiBncmV5IHNob3dzIHRoZSBwcm9ncmVzcyBpbiAyMDIxIGZvciB0aGUgc2FtZSBhY3Rpdml0eS4gSXQgaXMgb2JzZXJ2ZWQgdGhhdCBmb29kIGRpc3RyaWJ1dGlvbnMgaW4gMjAyMiBncmVhdGx5IG91dHBhY2VkIHRob3NlIGluIDIwMjEuIFRoZSBzYW1lIGlzIGFsc28gdHJ1ZSBmb3IgY2FzaC93b3JrIGZvciBmb29kL2Fzc2V0cyBhbmQgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMuIA0KDQo8YnI+DQoNCmBgYHtyIHByb2dyZXNzLWZhY2V0LWxpbmVwbG90fQ0KDQphY3RfbGluZV8yMDIxIDwtIGZzY18yMDIxICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgbXV0YXRlKGRhdGUgPSBkYXRlICsgeWVhcnMoMSkpICU+JSANCiAgZ3JvdXBfYnkoYWN0aXZpdHlfcmVkKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUoYWN0aXZpdHlfcmVkID0gc3RyX3JlcGxhY2VfYWxsKGFjdGl2aXR5X3JlZCwgInByb3Zpc2lvbiBvZiAiLCAiIikpICU+JSANCiAgZmlsdGVyKGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJmaXNoZXJ5IGtpdHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21tdW5pdHkgaW5mcmFzdHJ1Y3R1cmUgYW5kIGVxdWlwbWVudCIpKQ0KDQpmc2MgJT4lIA0KICBncm91cF9ieShkYXRlLCBhY3Rpdml0eV9yZWQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgIyByYmluZChmc2NfMjAyMSAlPiUgDQogICMgICAgICAgICAjIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICMgICAgICAgICBncm91cF9ieShkYXRlLCBhY3Rpdml0eV9yZWQpICU+JSANCiAgIyAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JSANCiAgYXJyYW5nZShkYXRlKSAlPiUgDQogIG11dGF0ZShjdW1fYmVuID0gY3Vtc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGFycmFuZ2UoYWN0aXZpdHlfcmVkKSAlPiUgDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHlfcmVkLCAicHJvdmlzaW9uIG9mICIsICIiKSkgJT4lDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgJW91dCUgYygiZmlzaGVyeSBraXRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tbXVuaXR5IGluZnJhc3RydWN0dXJlIGFuZCBlcXVpcG1lbnQiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkYXRlLCB5ID0gY3VtX2JlbiwgY29sb3VyID0gYWN0aXZpdHlfcmVkKSkgKw0KICBnZW9tX3N0ZXAoZGF0YSA9IGFjdF9saW5lXzIwMjEsIA0KICAgICAgICAgICAgYWVzKHggPSBkYXRlLCANCiAgICAgICAgICAgICAgICB5ID0gY3VtX2JlbiksIA0KICAgICAgICAgICAgY29sb3VyID0gImdyZXkiLA0KICAgICAgICAgICAgc2l6ZSA9IDIsIA0KICAgICAgICAgICAgYWxwaGEgPSAuNCkgKyANCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wNi0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3ZsaW5lKGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyLCB4aW50ZXJjZXB0ID0gYXMubnVtZXJpYyhhcy5EYXRlKCIyMDIyLTAzLTAxIikpLCBhbHBoYSA9IC41KSArDQogIGdlb21fc3RlcChzaXplID0gMSkgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X3dyYXAofiBhY3Rpdml0eV9yZWQsIHNjYWxlcyA9ICJmcmVlX3kiKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUsIGFuZ2xlID0gNjAsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwgDQogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA1KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDYsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArIA0KICBsYWJzKHggPSAiTW9udGgiLCANCiAgICAgICB5ID0gIkN1bXVsYXRpdmUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB0aXRsZSA9ICJNb250aGx5IHByb2dyZXNzIGJ5IGFjdGl2aXR5LCAyMDIyIFExICYgUTIiLA0KICAgICAgIHN1YnRpdGxlID0gIkZpZ3VyZXMgYXJlIGluIGN1bXVsYXRpdmUgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMgcmVhY2hlZDsgcHJldmlvdXMgeWVhcidzIHByb2dyZXNzIGlzIGluIGdyZXkiKSArIA0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMikpIA0KICANCiMgZ2dzYXZlKCJhY3Rpdml0eV9mYWNldF9saW5lLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpICANCg0KYGBgDQoNCjxicj4NCg0KTmV3bHkgaW1wbGVtZW50ZWQgaW4gUTIgb2YgMjAyMiB3YXMgdGhlIHByb3Zpc2lvbiBvZiBIRUIgYW5kIGZvcnRpZmllZCByaWNlLCBsYXJnZWx5IGluIENoaW4gc3RhdGUuIEZvb2QgZGlzdHJpYnV0aW9ucyBjb250aW51ZWQgdG8gYmUgdGhlIGxhcmdlc3QgYWN0aXZpdHksIGZvbGxvd2VkIGJ5IHRoZSBwcm92aXNpb24gb2YgY3JvcCwgdmVnZXRhYmxlIGFuZCBzZWVkIGtpdHMuDQoNCjxicj48YnI+DQoNCiMjIyAyLjIgQWdyaWN1bHR1cmFsIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzDQoNClRoZSBwZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhZ3JpY3VsdHVyZSBhbmQgbGl2ZWxpaG9vZHMgYWN0aXZpdGllcyAoY3JvcHMsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzOyBGRlMgYW5kIGZhcm1lciB0cmFpbmluZzsgSUdBIGFuZCBzbWFsbCBncmFudHM7IGxpdmVzdG9jayBraXRzKSBzbGlnaHRseSBpbiBRMiAyMDIyLCBjb21wYXJlZCB0byBRMS4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1hZ3JpY3VsdHVyYWwtYWN0aXZpdHl9DQpmc2MgJT4lIA0KICBtdXRhdGUoYWdyaWN1bHR1cmFsX2FjdGl2aXR5ID0gaWZlbHNlKGFjdGl2aXR5X3JlZCAlaW4lIGMoImNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJR0EgYW5kIHNtYWxsIGdyYW50cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpdmVzdG9jayBraXRzIiksICJ5ZXMiLCAibm8iKSwgDQogICAgICAgICBxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTEiID0gIk9uZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAicTIiID0gIlR3byIpKSAlPiUgDQogIGdyb3VwX2J5KGFncmljdWx0dXJhbF9hY3Rpdml0eSwgcXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShgJWJlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgYWdyaWN1bHR1cmFsX2FjdGl2aXR5ID0gZmN0X3JldihhZ3JpY3VsdHVyYWxfYWN0aXZpdHkpKSAlPiUgDQogIGFycmFuZ2UocXVhcnRlciwgYWdyaWN1bHR1cmFsX2FjdGl2aXR5KSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBmY3RfcmV2KHF1YXJ0ZXIpLCBmaWxsID0gYWdyaWN1bHR1cmFsX2FjdGl2aXR5KSkgKyANCiAgZ2VvbV9jb2wocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IGAlYmVuZWZpY2lhcmllc2ApLCANCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjRDM1NDAwIiwgIiM3NkQ3QzQiKSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJ5IGZyZXF1ZW5jaWVzIiwgDQogICAgICAgeSA9ICJRdWFydGVyIiwgDQogICAgICAgZmlsbCA9ICJhZ3JpY3VsdHVyYWxcbmFjdGl2aXR5IiwNCiAgICAgICB0aXRsZSA9ICJCZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgYWdyaWN1bHR1cmUgYW5kIGxpdmVsaWhvb2RzIGFjdGl2aXRpZXMiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgDQogICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMDAwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMDAwMCwgMTAwMDAwMCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAwMDAsIDMwMDAwMDApKQ0KDQpgYGANCg0KPGJyPg0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiBiZW5lZmljaWFyaWVzIG9mIGFncmljdWx0dXJhbCBhbmQgbGl2ZWxpaG9vZHMgYWN0aXZpdGllcyBhcmUgcmVjaXBpZW50cyBvZiBmYXJtZXIgdHJhaW5pbmcgYW5kIGNyb3AsIHZlZ2V0YWJsZSBhbmQgc2VlZCBraXRzLiBJdCBpcyBwb3NzaWJsZSB0aGF0IG5vdCBhbGwgb2YgUTIgd2FzIGF2YWlsYWJsZSBmb3IgZmFybWVyIHRyYWluaW5nLg0KDQo8YnI+DQoNCmBgYHtyIGJhcnBsb3QtZmFjZXQtYWctYWN0aXZpdGllc30NCmZzYyAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUdBIGFuZCBzbWFsbCBncmFudHMiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5X3JlZCwgcXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShgJWJlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMiksIA0KICAgICAgICAgcXVhcnRlciA9IHJlY29kZShxdWFydGVyLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInExIiA9ICJRdWFydGVyXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInEyIiA9ICJRdWFydGVyXzIiKSwgDQogICAgICAgICApICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IGFjdGl2aXR5X3JlZCwgZmlsbCA9IGFjdGl2aXR5X3JlZCkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSkpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIA0KICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwgDQogICAgICAgICAgICBoanVzdCA9ICJpbndhcmQiKSArDQogIGZhY2V0X3dyYXAofiBxdWFydGVyKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcnkgZnJlcXVlbmNpZXMiLCANCiAgICAgICB5ID0gIiIsIA0KICAgICAgIGZpbGwgPSAiYWdyaWN1bHR1cmFsXG5hY3Rpdml0eSIsDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIGJ5IGFncmljdWx0dXJlIGFuZCBsaXZlbGlob29kcyBhY3Rpdml0aWVzIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEgLyAxMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwLCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjMgRGVsaXZlcnkgbW9kYWxpdGllcw0KDQpPbmx5IGNvbW11bml0eSBpbmZyYXN0cnVjdHVyZSBhbmQgZXF1aXBtZW50LCBIRUIgYW5kIGZvcnRpZmllZCByaWNlIGFuZCBraXRjaGVuIGdhcmRlbiBraXRzIHdlcmUgZGVsaXZlcmVkIGVudGlyZWx5IHRocm91Z2ggaW4ta2luZCBtb2RhbGl0aWVzLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eV9yZWQsIGRlbGl2ZXJ5X21vZGFsaXR5KSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSBkZWxpdmVyeV9tb2RhbGl0eSwgdmFsdWVzX2Zyb20gPSBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGFkb3JuX3BlcmNlbnRhZ2VzKCJyb3ciKSAlPiUgDQogIGFkb3JuX3BjdF9mb3JtYXR0aW5nKCkgJT4lIA0KICBsZWZ0X2pvaW4oZnNjICU+JQ0KICAgICAgICAgIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBtdXRhdGUoZGVsaXZlcnlfbW9kYWxpdHkgPSBjYXNlX3doZW4oc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIkh5YnJpZCIpIH4gIkh5YnJpZCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChkZWxpdmVyeV9tb2RhbGl0eSwgIlNlcnZpY2UiKSB+ICJTZXJ2aWNlIGRlbGl2ZXJ5IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUNCiAgICAgICAgICBncm91cF9ieShhY3Rpdml0eV9yZWQpICU+JQ0KICAgICAgICAgIHN1bW1hcmlzZShCZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwgDQogICAgICAgICAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpLCANCiAgICAgICAgICBieSA9ICJhY3Rpdml0eV9yZWQiKSAlPiUNCiAgYXJyYW5nZShkZXNjKEJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgbXV0YXRlKGFjdGl2aXR5X3JlZCA9IGlmZWxzZShhY3Rpdml0eV9yZWQgJWluJSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIklHQSBhbmQgc21hbGwgZ3JhbnRzIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIRUIgYW5kIGZvcnRpZmllZCByaWNlIGZvciBhY3V0ZSBlbWVyZ2VuY2llcyIpLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpdml0eV9yZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX3RvX3NlbnRlbmNlKGFjdGl2aXR5X3JlZCkpKSAlPiUgDQogIHJlbmFtZShBY3Rpdml0eSA9IGFjdGl2aXR5X3JlZCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhgSW4ta2luZGAsIGBTZXJ2aWNlIGRlbGl2ZXJ5YCwgYENCVC9DVkFgLCBgSHlicmlkYCksIH5yZWNvZGUoLiwgIi0iID0gTkFfY2hhcmFjdGVyXykpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJQZXJjZW50YWdlIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCBieSBhY3Rpdml0eSBhbmQgZGVsaXZlcnkgbW9kYWxpdHkiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQpgYGANCg0KPGJyPg0KDQpUaGVyZSBhcmUgYWxzbyBjbGVhciBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgYmVuZWZpY2lhcnkgdHlwZXMgYW5kIHRoZSBkZWxpdmVyeSBtb2RhbGl0aWVzIGVtcGxveWVkIHdpdGggdGhlbS4gQmVuZWZpY2lhcmllcyBmcm9tIGhvc3QvbG9jYWwgY29tbXVuaXRpZXMgbGFyZ2VseSByZWNlaXZlZCBpbi1raW5kIGRpc3RyaWJ1dGlvbnMgd2hpbHN0IHRob3NlIGZyb20gY2FtcHMgYW5kIElEUCBzaXRlcyBtb3N0bHkgcmVjZWl2ZWQgY2FzaC1iYXNlZCBpbnRlcnZlbnRpb25zLg0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWJlbi10eXBlLCBmaWcuaGVpZ2h0PTZ9DQoNCmZzYyAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lIA0KICBmaWx0ZXIoIWlzLm5hKGRlbGl2ZXJ5X21vZGFsaXR5KSAmICFpcy5uYShsb2NhdGlvbl90eXBlKSkgJT4lIA0KICBzdW1fYmVuMihkZWxpdmVyeV9tb2RhbGl0eSwgYmVuZWZpY2lhcnlfdHlwZSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBkZWxpdmVyeV9tb2RhbGl0eSwgeSA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBkZWxpdmVyeV9tb2RhbGl0eSkpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXMobGFiZWxzID0gY29tbWEpICsgDQogIGZhY2V0X3dyYXAofmJlbmVmaWNpYXJ5X3R5cGUsIHNjYWxlcyA9ICJmcmVlIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAyNSwgdmp1c3QgPSAuNywgaGp1c3QgPSAuNSksDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIiwNCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpICsNCiAgbGFicyh4ID0gIkRlbGl2ZXJ5IG1vZGFsaXR5IiwgeSA9ICJCZW5lZmljaWFyaWVzIiwNCiAgICAgICB0aXRsZSA9ICJEZWxpdmVyeSBtb2RhbGl0aWVzIGJ5IGJlbmVmaWNpYXJ5IHR5cGUiKQ0KICANCg0KYGBgDQoNCjxicj4NCg0KQXJlYXMgd2l0aCBtb3JlIElEUHMsIHN1Y2ggYXMgU2FnYWluZywgUmFraGluZSBhbmQgS2FjaGluLCByZWFjaCBtb3N0IG9mIHRoZWlyIGJlbmVmaWNpYXJpZXMgdGhyb3VnaCBjYXNoLWJhc2VkIHByb2dyYW1taW5nLg0KDQo8YnI+DQoNCmBgYHtyIGRlbGl2ZXJ5LW1vZGFsaXRpZXMtc3RhY2tlZC1iYXJ9DQpzdGF0ZV90b3RhbHMgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYShkZWxpdmVyeV9tb2RhbGl0eSkpICU+JSANCiAgZ3JvdXBfYnkoc3RhdGUpICU+JSANCiAgc3VtbWFyaXNlKHRvdGFsID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBtdXRhdGUocGMgPSAxLCANCiAgICAgICAgIHN0YXRlID0gZmN0X3Jlb3JkZXIoc3RhdGUsIHRvdGFsKSkNCg0KZnNjICU+JSAgDQogIGZpbHRlcighaXMubmEoZGVsaXZlcnlfbW9kYWxpdHkpKSAlPiUgIA0KICAgbXV0YXRlKGRlbGl2ZXJ5X21vZGFsaXR5ID0gY2FzZV93aGVuKHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJIeWJyaWQiKSB+ICJIeWJyaWQiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZGVsaXZlcnlfbW9kYWxpdHksICJTZXJ2aWNlIikgfiAiU2VydmljZSBkZWxpdmVyeSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGRlbGl2ZXJ5X21vZGFsaXR5KSkgJT4lDQogIGdyb3VwX2J5KHN0YXRlLCBkZWxpdmVyeV9tb2RhbGl0eSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBtdXRhdGUocGMgPSBiZW5lZmljaWFyaWVzIC8gc3VtKGJlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBmY3RfcmV2KHN0YXRlKSwgZmlsbCA9IGRlbGl2ZXJ5X21vZGFsaXR5KSkgKyANCiAgZ2VvbV9jb2woKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50LCBicmVha3MgPSBzZXEoMCwgMSwgYnkgPSAuMikpICsgDQogIGdlb21fdGV4dChhZXMoeSA9IHN0YXRlLCB4ID0gcGMgKyAwLjEyNSwgbGFiZWwgPSBjb21tYSh0b3RhbCwgYWNjdXJhY3kgPSAxKSwgZmlsbCA9IE5VTEwpLCANCiAgICAgICAgICAgIGRhdGEgPSBzdGF0ZV90b3RhbHMsIGhqdXN0ID0gImlud2FyZCIsIHNpemUgPSAyLjUpICsNCiAgbGFicyh4ID0gIiUgb2YgdG90YWwiLCB5ID0gIiIsIGZpbGwgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiUGVyY2VudGFnZSBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgYnkgZGVsaXZlcnkgbW9kYWxpdGllcyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlN0YXRlIGJlbmVmaWNpYXJ5IHRvdGFscyBhdCB0aGUgZW5kIG9mIGVhY2ggYmFyIikNCg0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyAzLiBDYXNoLWJhc2VkIHByb2dyYW1taW5nDQoNCiMjIyAzLjEgVVNEIHBlciBob3VzZWhvbGQNCg0KQ29tcGFyZWQgdG8gUTEsIGJlbmVmaWNpYXJpZXMgaW4gUTIgYXJlIG11Y2ggbGVzcyBsaWtlbHkgdG8gaGF2ZSByZWNlaXZlZCBjYXNoIHRyYW5zZmVycyBvZiBsZXNzIHRoYW4gVVNEIDEwIHBlciBob3VzZWhvbGQuIFRoZSBtb3N0IGNvbW1vbiB0cmFuc2ZlciB2YWx1ZXMgd2VyZSBiZXR3ZWVuIFVTRCA2MCBhbmQgNzAsIGFuIGluY3JlYXNlIGZyb20gdGhlIHByZXZpb3VzIHF1YXJ0ZXIuDQoNCjxicj4NCg0KYGBge3IgdXNkLWhoZC1iaW4tYmFycGxvdCwgZmlnLmhlaWdodD01fQ0KDQpmc2MgJT4lDQogIGZpbHRlcighaXMubmEodXNkX3Blcl9oaGQpICYgIWlzLm5hKG5ld19iZW5lZmljaWFyaWVzKSkgJT4lIA0KICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDQlQvQ1ZBIiwgIkh5YnJpZCAoSW4ta2luZCAmIENCVC9DVkEpIikpICU+JQ0KICBncm91cF9ieSh1c2RfaGhkX2JpbiwgcXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UoaG91c2Vob2xkcyA9IHN1bShob3VzZWhvbGRzKSkgJT4lIA0KICBncm91cF9ieShxdWFydGVyKSAlPiUgDQogIG11dGF0ZShgJV9vZl9oaGRgID0gcm91bmQoaG91c2Vob2xkcyAvIHN1bShob3VzZWhvbGRzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHF1YXJ0ZXIgPSByZWNvZGUocXVhcnRlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgInExIiA9ICJRdWFydGVyXzEiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgInEyIiA9ICJRdWFydGVyXzIiKSkgJT4lICANCiAgbXV0YXRlKHVzZF9oaGRfYmluID0gZmN0X3JlbGV2ZWwodXNkX2hoZF9iaW4sIGMoIjwkMTAiLCAiPj0kMTBfPCQyMCIsICI+PSQyMF88JDMwIiwgIj49JDMwXzwkNDAiLCAiPj0kNDBfPCQ1MCIsIj49JDUwXzwkNjAiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDYwXzwkNzAiLCAiPj0kNzBfPCQ4MCIsICI+PSQ4MF88JDkwIiwiPj0kOTBfPCQxMDAiLCI+PSQxMDAiKSkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gdXNkX2hoZF9iaW4sIHkgPSBob3VzZWhvbGRzLCBmaWxsID0gdXNkX2hoZF9iaW4pKSArIA0KICBnZW9tX2NvbCgpICsgDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBgJV9vZl9oaGRgKSwgdmp1c3QgPSAtMC40LCBzaXplID0gMykgKyANCiAgZmFjZXRfd3JhcCh+IHF1YXJ0ZXIpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIiwgZGlyZWN0aW9uID0gLTEpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgYnJlYWtzID0gc2VxKDAsIDgwMDAwLCBieSA9IDEwMDAwKSkgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAwLjgsIHZqdXN0ID0gMC45KSwgDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpKSArDQogIGxhYnMoeCA9ICJVU0QgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkIHBlciBtb250aCIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgaG91c2Vob2xkcyIsDQogICAgICAgdGl0bGUgPSAiTnVtYmVyIG9mIGhvdXNlaG9sZHMgYnkgdmFsdWUgb2YgY2FzaCB0cmFuc2ZlciBwZXIgaG91c2Vob2xkICgyMDIyL1ExKSIsDQogICAgICAgc3VidGl0bGUgPSAiRmlndXJlcyBhdCB0aGUgdG9wIG9mIGVhY2ggYmFyIHNob3cgcGVyY2VudGFnZSBvZiBob3VzZWhvbGRzXG5Pbmx5IGhvdXNlaG9sZHMgcmVhY2hlZCB0aHJvdWdoIHRoZSBjYXNoLCBoeWJyaWQgb3Igdm91Y2hlciBtb2RhbGl0aWVzIGFyZSBpbmNsdWRlZCIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDMuMyBVU0QgcGVyIHBlcnNvbg0KDQpUaGUgYm94cGxvdHMgYWJvdmUgc2hvd3MgdGhlIHJhbmdlIG9mIGNhc2ggdHJhbnNmZXIgdmFsdWVzIChhbGwgdmFsdWVzIGFyZSBwZXIgcGVyc29uLCB0byBmYWNpbGl0YXRlIGNvbXBhcmFiaWxpdHkpIGJ5IGFjdGl2aXR5LiBUaGUgYXZlcmFnZSBmb3IgcmVhY2ggYWN0aXZpdHkgaXMgbWFya2VkIGJ5IHRoZSB0aGljayBsaW5lIGluIHRoZSBtaWRkbGUgb2YgZWFjaCBib3guIFRoZSBsZWZ0bW9zdCBhbmQgcmlnaHRtb3N0IHNpZGUgb2YgZWFjaCBib3ggaW5kaWNhdGUgdGhlIDI1dGggYW5kIDc1dGggcGVyY2VudGlsZSBvZiB0cmFuc2ZlciB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gVGhlIGxlbmd0aCBvZiBlYWNoIGJveCBpcyBhIGdhdWdlIGZvciBob3cgbXVjaCB2YXJpYXRpb24gdGhlcmUgaXMgaW4gdGhlIHRyYW5zZmVyIHZhbHVlcyBvZiBlYWNoIGFjdGl2aXR5Lg0KDQo8YnI+DQoNCmBgYHtyIGJveHBsb3QtYWN0aXZpdHktdXNkLXBlci1wZXJzb259DQoNCmZzYyAlPiUgZmlsdGVyKCFpcy5uYSh0b3RhbF92YWx1ZV91c2QpICYgYWN0aXZpdHlfcmVkICVvdXQlIGMoIkZGUyBhbmQgZmFybWVyIHRyYWluaW5nIiwgInZvY2F0aW9uYWwgdHJhaW5pbmciKSkgJT4lDQogIG11dGF0ZShhY3Rpdml0eV9yZWQgPSBmY3RfcmVsZXZlbChhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiZm9vZCBkaXN0cmlidXRpb24iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vZF9jYXNoIGZvciB3b3JrX2Fzc2V0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVsdGktcHVycG9zZSBjYXNoIHRyYW5zZmVyIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXZlc3RvY2sga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm9wLCB2ZWdldGFibGUgYW5kIHNlZWQga2l0cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJR0EgYW5kIHNtYWxsIGdyYW50cyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gYWN0aXZpdHlfcmVkLCB4ID0gdXNkX3Blcl9wZXJzb24sIGNvbG91ciA9IGFjdGl2aXR5X3JlZCkpICsgDQogIGdlb21faml0dGVyKGFscGhhID0gLjEsIGFlcyhzaXplID0gYmVuZWZpY2lhcmllcykpICsNCiAgZ2VvbV9ib3hwbG90KGFscGhhID0gLjgsIG91dGxpZXIuYWxwaGEgPSAuMikgKyANCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAzLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSwgDQogICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArDQogIGxhYnMoeCA9ICJVU0QgcGVyIHBlcnNvbiIsIHkgPSAiIiwgDQogICAgICAgdGl0bGUgPSAiQm94cGxvdHMgb2YgVVNEIHRyYW5zZmVyIHZhbHVlcyBwZXIgcGVyc29uIGluIDIwMjIgKFExICYgUTIpIiwgDQogICAgICAgc3VidGl0bGUgPSAiVGhpY2sgbGluZSBpbiBlYWNoIGJveCBpcyB0aGUgbWVhbjtcbiBQb2ludHMgYXJlIGluZGl2aWR1YWwgZGlzdHJpYnV0aW9ucywgc2l6ZXMgaW5kaWNhdGUgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMiKQ0KDQogDQpgYGANCg0KPGJyPg0KDQpFYWNoIG9mIHRoZSBidWJibGVzIHJlcHJlc2VudHMgYW4gaW5kaXZpZHVhbCBkaXN0cmlidXRpb24sIHdpdGggdGhlaXIgcG9zaXRpb24gYWxvbmcgdGhlIHgtYXhpcyBzaG93aW5nIHRoZSBVU0QgcGVyIHBlcnNvbiB2YWx1ZSBvZiB0aGUgZGlzdHJpYnV0aW9uIGFuZCB0aGUgc2l6ZSBvZiBlYWNoIGJ1YmJsZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkLg0KDQpGb29kIGRpc3RyaWJ1dGlvbnMgdGVuZGVkIHRvIGhhdmUgdGhlIHRpZ2h0ZXN0IHJhbmdlIG9mIHZhbHVlcy4NCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHJhbnNmZXItdmFsdWUtc2NhdHRlciwgZmlnLmhlaWdodD02fQ0KDQptb25leV9zY2F0dGVyIDwtIGZzYyAlPiUgDQogIGZpbHRlcighaXMubmEodG90YWxfdmFsdWVfdXNkKSAmIGFjdGl2aXR5X3JlZCAlb3V0JSBjKCJsaXZlc3RvY2sga2l0cyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm9jYXRpb25hbCB0cmFpbmluZyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRkZTIGFuZCBmYXJtZXIgdHJhaW5pbmciKSkgJT4lDQogIGdyb3VwX2J5KHN0YXRlLCB0b3duc2hpcCwgbG9jYXRpb24sIG9yZ19jb2RlLCBhY3Rpdml0eV9yZWQsIHF1YXJ0ZXIpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgdG90YWxfdmFsdWVfdXNkID0gc3VtKHRvdGFsX3ZhbHVlX3VzZCksIA0KICAgICAgICAgICAgcm91bmRzID0gbl9kaXN0aW5jdChkYXRlKSwgDQogICAgICAgICAgICAuZ3JvdXBzID0gImRyb3AiKSAlPiUgDQogIG11dGF0ZShxdWFydGVyID0gcmVjb2RlKHF1YXJ0ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMSIgPSAiUXVhcnRlcl8xIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMiIgPSAiUXVhcnRlcl8yIikpICU+JSANCiAgbXV0YXRlKHBlcl9wZXJzb24gPSByb3VuZCh0b3RhbF92YWx1ZV91c2QgLyBiZW5lZmljaWFyaWVzLCBkaWdpdHMgPSAyKSkgJT4lIA0KICBmaWx0ZXIodG90YWxfdmFsdWVfdXNkID4gMCkgJT4lDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSBwZXJfcGVyc29uLCBjb2xvdXIgPSBhY3Rpdml0eV9yZWQsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAob3JnX2NvZGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZpdHlfcmVkLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW4uIGZyZXF1ZW5jaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVTRCBwZXIgcGVyc29uOiAiLCBkb2xsYXIocGVyX3BlcnNvbiksICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIHZhbHVlOiAiLCBkb2xsYXIodG90YWxfdmFsdWVfdXNkLCBhY2N1cmFjeSA9IDEpLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJyb3VuZHM6ICIsIHJvdW5kcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcCwgIiwgIiwgc3RhdGUpKSkgKyANCiAgZ2VvbV9qaXR0ZXIoYWVzKHNpemUgPSB0b3RhbF92YWx1ZV91c2QpLCBhbHBoYSA9IC41KSArIA0KICBzY2FsZV95X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBicmVha3MgPSBjKDAsIDEsIDMsIDEwLCAzMCwgMTAwLCAzMDApLCBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsgDQogIHNjYWxlX3hfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGxhYmVscyA9IGNvbW1hLCBicmVha3MgPSBjKDAsIDEwLCAxMDAsIDEwMDAsIDEwMDAwLCAxMDAwMDAsIDMwMDAwMCkpICsgDQogIHNjYWxlX3NpemVfY29udGludW91cyhndWlkZSA9ICJub25lIiwgcmFuZ2UgPSBjKDAuMywgNSkpICsgDQogIGxhYnMoeCA9ICJCZW5lZmljaWFyeSBmcmVxdWVuY2llcyIsIA0KICAgICAgIHkgPSAiVVNEIHZhbHVlIHBlciBwZXJzb24iLCANCiAgICAgICB0aXRsZSA9ICJBdmVyYWdlIFVTRCB0cmFuc2ZlciB2YWx1ZSBwZXIgcGVyc29uIGluIDIwMjIgKFExICYgUTIpXG5CeSBvcmdhbmlzYXRpb24sIGxvY2F0aW9uIGFuZCBhY3Rpdml0eSIsIA0KICAgICAgIHN1YnRpdGxlID0gIkJ5IG9yZ2FuaXNhdGlvbiwgbG9jYXRpb24gYW5kIGFjdGl2aXR5IiwgDQogICAgICAgY29sb3VyID0gImJ5IG9yZywgbG9jYXRpb24gYW5kIGFjdGl2aXR5XG5kb3VibGUtY2xpY2sgdG8gc2VsZWN0IikgKyANCiAgdGhlbWUobGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUpLA0KICAgICAgICBzdHJpcC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChmaWxsID0gIiMyMTIxMjEiKSkgKyANCiAgZ3VpZGVzKGNvbG91ciA9IGd1aWRlX2xlZ2VuZChvdmVycmlkZS5hZXMgPSBsaXN0KHNpemUgPSAxLCBhbHBoYSA9IDEpKSkgKyANCiAgZmFjZXRfd3JhcCh+IHF1YXJ0ZXIpDQoNCmdncGxvdGx5KG1vbmV5X3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiQXZlcmFnZSBVU0QgdHJhbnNmZXIgdmFsdWUgcGVyIHBlcnNvbiBpbiAyMDIyIChRMSAmIFEyKSIpKSkNCg0KDQpgYGANCg0KPGJyPg0KDQpDYXNoIHRyYW5zZmVyIHZhbHVlcyB0ZW5kZWQgdG8gYmUgaGlnaGVyIGluIFEyIGFzIGNvbXBhcmVkIHRvIFExIGxhcmdlbHkgZHVlIHRvIGluY3JlYXNlcyBpbiB0aGUgcGVyLWhvdXNlaG9sZCBwYWNrYWdlIG9mIG11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlcnMuDQoNCjxicj48YnI+PGJyPg0KDQojIyMgMy4zIEZvb2QgZGlzdHJpYnV0aW9ucw0KDQpgYGB7ciBwbG90bHktZm9vZC1kaXN0LXJhbmdlfQ0KDQpmb29kX2Rpc3RfcmFuZ2UgPC0gZnNjICU+JSANCiAgZmlsdGVyKCFpcy5uYSh1c2RfcGVyX3BlcnNvbikpICU+JQ0KICBmaWx0ZXIoYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIgJiB1c2RfcGVyX3BlcnNvbiA8IDYwKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHVzZF9wZXJfcGVyc29uLCB5ID0gc3RhdGUsIGNvbG91ciA9IHN0YXRlLCANCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKG9yZ19jb2RlLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2aXR5X3JlZCwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuLiBmcmVxdWVuY2llczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJVU0QgcGVyIHBlcnNvbjogIiwgZG9sbGFyKHVzZF9wZXJfcGVyc29uKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAidG90YWwgdmFsdWU6ICIsIGRvbGxhcih0b3RhbF92YWx1ZV91c2QsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICB0b3duc2hpcCwgIiwgIiwgc3RhdGUpKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMTEuNDU1LCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIiwgYWxwaGEgPSAuNSwgc2l6ZSA9IC4zKSArIA0KICBnZW9tX2ppdHRlcihhbHBoYSA9IDAuMywgYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKCkgKw0KICBzY2FsZV9zaXplX2NvbnRpbnVvdXMocmFuZ2UgPSBjKDAuMywgMTApKSArDQogIHNjYWxlX3hfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgOTAsIGJ5ID0gMTApLCBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgbGFicyh4ID0gIlVTRCB2YWx1ZSBwZXIgcGVyc29uIiwgDQogICAgICAgeSA9ICIiLCANCiAgICAgICB0aXRsZSA9ICJGb29kIGRpc3RyaWJ1dGlvbjogcmFuZ2Ugb2YgVVNEIHZhbHVlcyBwZXIgcGVyc29uIGJ5IHN0YXRlIGluIDIwMjIvUTEiLA0KICAgICAgIHNpemUgPSAiIiwgY29sb3VyID0gIiIpIA0KDQpnZ3Bsb3RseShmb29kX2Rpc3RfcmFuZ2UsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSAgNjAwKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiRm9vZCBkaXN0cmlidXRpb246IHJhbmdlIG9mIFVTRCB2YWx1ZXMgcGVyIHBlcnNvbiBieSBzdGF0ZSBpbiAyMDIyIChRMSAmIFEyKSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSByZWQgbGluZSBpcyA1MCUgb2YgMS81IG9mIGZvb2QgTUVCOyBkb3VibGUtY2xpY2sgb24gbGVnZW5kIHRvIHNlbGVjdCIsIjwvc3VwPiIpKSwgDQogICAgICAgICBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA3KSkpIA0KYGBgDQoNCjxicj4NCg0KS2FjaGluLCBSYWtoaW5lIGFuZCBTaGFuIG5vdGFibHkgaGF2ZSBzZXZlcmFsIGV4dHJlbWUgb3V0bGllcnMgbXVjaCBoaWdoZXIgdGhhbiB0aGUgYXZlcmFnZSBmb3IgdGhhdCBzdGF0ZS4gS2F5aW4sIGhvd2V2ZXIsIGhhcyBhIHZlcnkgbGFyZ2UgbnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgd2hvIHJlY2VpdmVkIGxlc3MgdGhlIFVTRCAxL3BlcnNvbi4gRGlzdHJpYnV0aW9ucyBpbiBDaGluIGFuZCBBeWV5YXJ3YWR5IGhhZCB2ZXJ5IGNvbnNpc3RlbnQgdmFsdWVzIGFzIHRoZXkgd2VyZSBhbGwgaW1wbGVtZW50ZWQgYnkgdGhlIHNhbWUgaW1wbGVtZW50aW5nIHBhcnRuZXIuDQoNClRoZSB0YWJsZSBiZWxvdyBjb21wYXJlcyB0aGUgZGlmZmVyZW50IGJpbnMgZm9yIGNhc2ggdHJhbnNmZXIgdmFsdWVzIG9mIGZvb2QgZGlzdHJpYnV0aW9ucyB3aXRoIHRoZSBtaW5pbXVtIGV4cGVuZGl0dXJlIGJhc2tldCBmb3IgZm9vZCBlc3RhYmxpc2hlZCBieSB0aGUgQ2FzaCBXb3JraW5nIEdyb3VwLiBUaGV5IGhhdmUgZXN0YWJsaXNoZWQgYSBmbG9vciBvZiBNTUsgMTkwLDU1NSAob3IgVVNEIDExNC41NSkuDQoNCk92ZXJhbGwsIGByIHJvdW5kKChmaWx0ZXIoZnNjLCB1c2RfcGVyX3BlcnNvbiA+PSAoMTE0LjU1IC8gNSkgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChmaWx0ZXIoZnNjLCAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgb2YgZm9vZCBkaXN0cmlidXRpb24gYmVuZWZpY2lhcmllcyBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IDEwMCUgb2YgdGhlIE1FQiBhbmQgYHIgcm91bmQoKGZpbHRlcihmc2MsIHVzZF9wZXJfcGVyc29uID49ICgxMTQuNTUgLyA1IC8gMikgJiBhY3Rpdml0eV9yZWQgPT0gImZvb2QgZGlzdHJpYnV0aW9uIikgJT4lIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9KSAvIChmaWx0ZXIoZnNjLCAhaXMubmEodXNkX3Blcl9wZXJzb24pICYgYWN0aXZpdHlfcmVkID09ICJmb29kIGRpc3RyaWJ1dGlvbiIpICU+JSB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSkgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCA1MCUgb2YgdGhlIE1FQiAoVVNEIDExLjQ1IHBlciBwZXJzb24pLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLW1lYi11c2QtaGhkLWJpbn0NCg0KZm9vZF9iaW5zIDwtIGZzYyAlPiUgZmlsdGVyKGFjdGl2aXR5X3JlZCAlaW4lIGMoImZvb2QgZGlzdHJpYnV0aW9uIikgJiANCiAgICAgICAgICAgICAgICAgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmIA0KICAgICAgICAgICAgICAgICAhaXMubmEobmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGNvdW50KHVzZF9wZXJzb25fYmluLCB3dCA9IG5ld19iZW5lZmljaWFyaWVzKSAlPiUgDQogIG11dGF0ZShwY19vZl90b3RhbCA9IHJvdW5kKG4gLyBzdW0obikgKiAxMDAsIGRpZ2l0cyA9IDIpLA0KICAgICAgICAgdXNkX3BlcnNvbl9iaW4gPSBmY3RfcmVsZXZlbCh1c2RfcGVyc29uX2JpbiwgYygiPCQyIiwgIj49JDJfPCQ0IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQ0XzwkNiIsICI+PSQ2XzwkOCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kOF88JDEwIiwiPj0kMTBfPCQxMiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQxMl88JDE0IiwgIj49JDE0XzwkMTYiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDE2XzwkMTgiLCAiPj0kMThfPCQyMCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PTIwIikpKSAlPiUgDQogIGFycmFuZ2UodXNkX3BlcnNvbl9iaW4pDQoNCmZzYyAlPiUgDQogIGZpbHRlcihhY3Rpdml0eV9yZWQgJWluJSBjKCJmb29kIGRpc3RyaWJ1dGlvbiIpICYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzLm5hKHVzZF9wZXJfcGVyc29uKSAmDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykpICU+JQ0KICBtdXRhdGUocGNfbWViID0gdXNkX3Blcl9wZXJzb24gKiA1IC8gMTE0LjU1LCANCiAgICAgICAgIHVzZF9wZXJzb25fYmluID0gZmN0X3JlbGV2ZWwodXNkX3BlcnNvbl9iaW4sIGMoIjwkMiIsICI+PSQyXzwkNCIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kNF88JDYiLCAiPj0kNl88JDgiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIj49JDhfPCQxMCIsIj49JDEwXzwkMTIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0kMTJfPCQxNCIsICI+PSQxNF88JDE2IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI+PSQxNl88JDE4IiwgIj49JDE4XzwkMjAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPj0yMCIpKSkgJT4lIA0KICBncm91cF9ieSh1c2RfcGVyc29uX2JpbikgJT4lIA0KICBzdW1tYXJpc2UoYXZnX3BjX29mX21lYiA9IHJvdW5kKG1lYW4ocGNfbWViKSAqIDEwMCwgZGlnaXRzID0gMiksDQogICAgICAgICAgICBhdmdfdXNkX21vbnRoID0gcm91bmQobWVhbih1c2RfcGVyX3BlcnNvbiwgbmEucm0gPSBUUlVFKSwgZGlnaXRzID0gMiksDQogICAgICAgICAgICBiZW5lZmljaWFyaWVzID0gcm91bmQoc3VtKG5ld19iZW5lZmljaWFyaWVzKSkpICU+JSANCiAgbXV0YXRlKHBjX29mX2hoZCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVVNEIHZhbHVlcyBvZiBmb29kIGRpc3RyaWJ1dGlvbnMgYnkgcGVyY2VudGFnZSBvZiBNRUIgcmVjZWl2ZWQiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgY29sdW1uX3NwZWMoNSwgY29sb3IgPSAid2hpdGUiLCBiYWNrZ3JvdW5kID0gc3BlY19jb2xvcihmb29kX2JpbnMkcGNfb2ZfdG90YWxbMToxMV0sIGVuZCA9IDAuOSwgZGlyZWN0aW9uID0gLTEpKSAlPiUNCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJPbmx5IHBlcnNvbnMgcmVhY2hlZCB0aHJvdWdoIENCVC9DVkEvaHlicmlkIG1vZGFsaXRpZXMgYXJlIGluY2x1ZGVkIiwNCiAgICAgICAgICAgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KIyBwYW5kZXIoY2FwdGlvbiA9ICJNb250aGx5IGNhc2gtYmFzZWQgdHJhbnNmZXIgdmFsdWVzIGJ5IHBlcmNlbnRhZ2Ugb2YgTUVCIHJlY2VpdmVkIikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAzLjQgSW1wbGVtZW50aW5nIHBhcnRuZXJzDQoNCmBgYHtyIHBhcnRuZXItY2FzaC12YWx1ZXMsIGZpZy5oZWlnaHQ9Ni41fQ0KcGFydG5lcl9tZWFuX3VzZCA8LSBmdW5jdGlvbih0YmwsIG5hbWUpew0KDQogIHRibCAlPiUgDQogICAgZmlsdGVyKCFpcy5uYShuZXdfYmVuZWZpY2lhcmllcykgJiAhaXMubmEodXNkX3Blcl9oaGQpKSAlPiUNCiAgICBmaWx0ZXIoZGVsaXZlcnlfbW9kYWxpdHkgJWluJSBjKCJDQlQvQ1ZBIiwgIkh5YnJpZCAoSW4ta2luZCAmIENCVC9DVkEpIikpICU+JQ0KICAgIGZpbHRlcihhY3Rpdml0eV9yZWQgPT0ge3tuYW1lfX0pICU+JQ0KICAgIG11dGF0ZShob3VzZWhvbGRzID0gaWZlbHNlKGFjdGl2aXR5X3JlZCA9PSAiZm9vZCBkaXN0cmlidXRpb24iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG91c2Vob2xkcykpICU+JSANCiAgICBncm91cF9ieShvcmdfY29kZSkgJT4lIA0KICAgIHN1bW1hcmlzZSh0b3RhbF92YWx1ZV91c2QgPSBzdW0odG90YWxfdmFsdWVfdXNkKSwNCiAgICAgICAgICAgICAgYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgICBob3VzZWhvbGRzID0gc3VtKGhvdXNlaG9sZHMpKSAlPiUgDQogICAgbXV0YXRlKG1lYW5fdXNkID0gdG90YWxfdmFsdWVfdXNkIC8gaG91c2Vob2xkcykgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lICANCiAgICB0b3Bfbig3KSAlPiUgDQogICAgbXV0YXRlKG9yZ19jb2RlID0gZmN0X3Jlb3JkZXIob3JnX2NvZGUsIGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgZ2dwbG90KGFlcyh4ID0gYmVuZWZpY2lhcmllcywgeSA9IG9yZ19jb2RlLCBmaWxsID0gbWVhbl91c2QpKSArIA0KICAgIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoYWNjdXJhY3kgPSAxKSkgKyANCiAgICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gIm1ha28iLCBkaXJlY3Rpb24gPSAtMSwgYmVnaW4gPSAwLjIsIA0KICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBkb2xsYXJfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgICBnZW9tX2NvbCgpICsNCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsID0gZG9sbGFyKG1lYW5fdXNkKSksIHNpemUgPSAzLCBoanVzdCA9ICJpbndhcmQiKSArIA0KICAgIHRoZW1lKGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4KSkgKw0KICBsYWJzKHggPSAiTnVtYmVyIG9mIGJlbmVmaWNpYXJpZXMgcmVhY2hlZCIsIA0KICAgICAgIHkgPSAiIiwgDQogICAgICAgZmlsbCA9ICJBdmcgVVNEIikgKw0KICAgIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNyksDQogICAgICAgICAgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDUuNSksIA0KICAgICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpKQ0KfQ0KDQpmc2MgJT4lIHBhcnRuZXJfbWVhbl91c2QoIm11bHRpLXB1cnBvc2UgY2FzaCB0cmFuc2ZlciIpICsNCiAgbGFicyh0aXRsZSA9ICJNdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXIgKHBlciBoaGQpIikgKyANCmZzYyAlPiUgcGFydG5lcl9tZWFuX3VzZCgiZm9vZCBkaXN0cmlidXRpb24iKSArDQogIGxhYnModGl0bGUgPSAiRm9vZCBkaXN0cmlidXRpb25zIChwZXIgcGVyc29uKSIpICsNCmZzYyAlPiUgcGFydG5lcl9tZWFuX3VzZCgiZm9vZF9jYXNoIGZvciB3b3JrX2Fzc2V0cyIpICsgDQogIGxhYnModGl0bGUgPSAiRm9vZC9jYXNoIGZvciB3b3JrL2Fzc2V0cyAocGVyIGhoZCkiKSArIA0KZnNjICU+JSBwYXJ0bmVyX21lYW5fdXNkKCJJR0EgYW5kIHNtYWxsIGdyYW50cyIpICsNCiAgbGFicyh0aXRsZSA9ICJJR0EgYW5kIHNtYWxsIGdyYW50cyAocGVyIGhoZCkiKSArIA0KICBwbG90X2Fubm90YXRpb24odGl0bGUgPSAiQ2FzaCB0cmFuc2ZlciB2YWx1ZXMgb2YgdGhlIHRvcCBpbXBsZW1lbnRpbmcgcGFydG5lcnMgKGJ5IGJlbmVmaWNpYXJpZXMgcmVhY2hlZCkiLCANCiAgICAgICAgICAgICAgICAgIHN1YnRpdGxlID0gIkZhY2V0ZWQgYnkgYWN0aXZpdHkiKQ0KIyMjPWktDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDQuIEJlbmVmaWNpYXJpZXMNCg0KIyMjIDQuMSBCZW5lZmljaWFyeSB0eXBlcw0KDQpJbiBRMiAyMDIyLCBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJIb3N0L2xvY2FsIENvbW11bml0eSIgJiBxdWFydGVyID09ICJxMiIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIHdlcmUgZnJvbSBob3N0IG9yIGxvY2FsIGNvbW11bml0aWVzLCBpbiBjb21wYXJpc29uIHRvIGByIHJvdW5kKGZpbHRlcihmc2MsIGJlbmVmaWNpYXJ5X3R5cGUgPT0gIkhvc3QvbG9jYWwgQ29tbXVuaXR5IiAmIHF1YXJ0ZXIgPT0gInExIikgJT4lICB7c3VtKC4kbmV3X2JlbmVmaWNpYXJpZXMpfSAvIHN1bShmc2MkbmV3X2JlbmVmaWNpYXJpZXMpICogMTAwLCBkaWdpdHMgPSAyKWAlIGZvciByb3VuZCAxLiBgciByb3VuZChmaWx0ZXIoZnNjLCBiZW5lZmljaWFyeV90eXBlID09ICJJbnRlcm5hbGx5IERpc3BsYWNlZCIgJiBxdWFydGVyID09ICJxMiIpICU+JSAge3N1bSguJG5ld19iZW5lZmljaWFyaWVzKX0gLyBzdW0oZnNjJG5ld19iZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMilgJSBvZiBiZW5lZmljaWFyaWVzIGluIFEyIHdlcmUgSURQcywgY29tcGFyZWQgdG8gYHIgcm91bmQoZmlsdGVyKGZzYywgYmVuZWZpY2lhcnlfdHlwZSA9PSAiSW50ZXJuYWxseSBEaXNwbGFjZWQiICYgcXVhcnRlciA9PSAicTEiKSAlPiUgIHtzdW0oLiRuZXdfYmVuZWZpY2lhcmllcyl9IC8gc3VtKGZzYyRuZXdfYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpYCUgZm9yIFExLg0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoYmVuZWZpY2lhcnlfdHlwZSwgcXVhcnRlcikgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgLmdyb3VwcyA9ICJkcm9wIikgJT4lIA0KICBtdXRhdGUoYmVuZWZpY2lhcnlfdHlwZSA9IGZjdF9yZW9yZGVyKGJlbmVmaWNpYXJ5X3R5cGUsIGJlbmVmaWNpYXJpZXMpLCANCiAgICAgICAgIHF1YXJ0ZXIgPSByZWNvZGUocXVhcnRlciwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMSIgPSAiUXVhcnRlcl8xIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICJxMiIgPSAiUXVhcnRlcl8yIikpICU+JSANCiAgZ2dwbG90KGFlcyh5ID0gYmVuZWZpY2lhcnlfdHlwZSwgeCA9IGJlbmVmaWNpYXJpZXMsIGZpbGwgPSBiZW5lZmljaWFyeV90eXBlKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBjb21tYShiZW5lZmljaWFyaWVzKSksIHNpemUgPSAzLCB2anVzdCA9IC0wLjUsIA0KICAgICAgICAgICAgaGp1c3QgPSAiaW53YXJkIikgKw0KICBzY2FsZV94X2NvbnRpbnVvdXMobGFiZWxzID0gbnVtYmVyX2Zvcm1hdChzY2FsZSA9IDEgLyAxMDAwLCBzdWZmaXggPSAiSyIpKSArDQogIHNjYWxlX2ZpbGxfZGlzY3JldGUoZ3VpZGUgPSAibm9uZSIpICsNCiAgZmFjZXRfcm93KHZhcnMocXVhcnRlciksIHNjYWxlcyA9ICJmcmVlX3giLCBzcGFjZSA9ICJmcmVlIikgKyANCiAgbGFicyh5ID0gIiIsDQogICAgICAgeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIA0KICAgICAgIHRpdGxlID0gIlBlcnNvbnMgcmVhY2hlZCBieSBiZW5lZmljaWFyeSB0eXBlIGluIFExICYgUTIgMjAyMiIpICsNCiAgdGhlbWUoc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gOCwgZmFjZSA9ICJib2xkIiksDQogICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoZmlsbCA9ICIjMjEyMTIxIikpDQogIA0KDQojIGdnc2F2ZSgiYmVuZWZpY2lhcnlfdHlwZV9xMV8yMDIyLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gNSwgd2lkdGggPSA4LCB1bml0cyA9ICJpbiIpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMiBFdmlkZW5jZSBvZiBmb29kIGluc2VjdXJpdHkgc3RhdHVzDQoNCk9mIHRoZSBmb29kIHNlY3VyaXR5IGFjdGl2aXRpZXMgcmVwb3J0ZWQsIHZlcnkgZmV3IHByb3ZpZGVkIGRldGFpbHMgYWJvdXQgdGhlIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgb2YgYmVuZWZpY2lhcmllcy4gVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgb3QgZGV0ZXJtaW5lIHdoZXRoZXIgaW50ZXJ2ZW50aW9ucyBhcmUgdHJ1bHkgcmVhY2hpbmcgdGhvc2UgbW9zdCBpbiBuZWVkLg0KDQpJbiBnZW5lcmFsLCB0aGUgZm9vZCBpbnNlY3VyaXR5IHN0YXR1cyBvZiB0aGUgYmVuZWZpY2lhcmllcyBvZiBtdWx0aS1wdXJwb3NlIGNhc2ggdHJhbnNmZXJzIHdlcmUgbXVjaCBiZXR0ZXIgZG9jdW1lbnRlZCB0aGFuIHRoZSBzdGF0dXNlcyBvZiB0aG9zZSB3aG8gcmVjZWl2ZWQgZm9vZCBkaXN0cmlidXRpb25zLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWZvb2QtaW5zZWN1cml0eS1zdGF0dXN9DQpmc2MgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChhY3Rpdml0eSwgIm1vZGVyYXRlfHNldmVyZSIpKSAlPiUgDQogIG11dGF0ZShoYXNfZXZpZGVuY2UgPSBpZmVsc2UoaXMubmEoZXZpZGVuY2UpLCAibm8iLCAieWVzIiksIA0KICAgICAgICAgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyA9IGlmZWxzZShpcy5uYShmb29kX2luc2VjdXJpdHlfc3RhdHVzKSwgIk5BIiwgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyksIA0KICAgICAgICAgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cyA9IGZjdF9yZWxldmVsKGZvb2RfaW5zZWN1cml0eV9zdGF0dXMsICJOQSIsIGFmdGVyID0gSW5mKSkgJT4lIA0KICBncm91cF9ieShhY3Rpdml0eSwgZm9vZF9pbnNlY3VyaXR5X3N0YXR1cykgJT4lDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKG5ld19iZW5lZmljaWFyaWVzKSwNCiAgICAgICAgICAgIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBtdXRhdGUoYWN0aXZpdHkgPSBzdHJfcmVwbGFjZV9hbGwoYWN0aXZpdHksICJcXChpbiBraW5kL3ZvdWNoZXIvY2FzaFxcKSIsICIiKSwgDQogICAgICAgICBhY3Rpdml0eSA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eSwgIlxcKE1QQ1xcKSIsICIiKSwgDQogICAgICAgICBhY3Rpdml0eSA9IHN0cl9yZXBsYWNlX2FsbChhY3Rpdml0eSwgIiAsICIsICIsICIpKSAlPiUgDQogIGdyb3VwX2J5KGFjdGl2aXR5KSAlPiUgDQogIG11dGF0ZShgJW9mX2dyb3VwYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiTWlzbWF0Y2ggYmV0d2VlbiBmb29kIGluc2VjdXJpdHkgc3RhdHVzIGFuZCBhY3Rpdml0eSAoUTEgJiBRMiAyMDIyKSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpLCANCiAgICAgICAgZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6ODAlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpDQpgYGANCg0KPGJyPg0KDQpFdmlkZW5jZSBvZiBiZW5lZmljaWFyaWVzJyBmb29kIGluc2VjdXJpdHkgc3RhdHVzIHByb3ZpZGVkIHRvIHRoZSBjbHVzdGVyIGluY2x1ZGU6DQoNCjxicj4NCg0KYGBge3IgdGFibGUtZnMtZXZpZGVuY2V9DQpmc2MgJT4lIA0KICBtdXRhdGUoZXZpZGVuY2UgPSBjYXNlX3doZW4oZXZpZGVuY2UgJWluJSBjKCIwLjk3IiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjk4JSBvZiBISCBoYXZlIEFjY2VwdGFibGUgRkNTIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjk5JSBvZiBob3VzZWhvbGRzIGhhdmUgYWNjZXB0YWJsZSBGQ1MiKSB+IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWNjZXB0YWJsZSBGQ1MiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2aWRlbmNlICVpbiUgYygiUERNIHJlcG9ydCIsICJQb3N0IERpc3RyaWJ1dGlvbiBNb25pdG9yaW5nIikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlBvc3QtZGlzdHJpYnV0aW9uIG1vbml0b3JpbmciLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QoZXZpZGVuY2UsICJjb25zdW1wdGlvbnxpbnRha2UiKSB+ICJBY2NlcHRhYmxlIEZDUyIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZpZGVuY2UgJWluJSBjKCJQcm92aXNpb24vU3VwcG9ydCBSZXBvcnQiLCAiTURSIikgfiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ3VsYXIgcmVwb3J0aW5nIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzLm5hKGV2aWRlbmNlKSB+ICJObyBldmlkZW5jZSIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IGV2aWRlbmNlKSwgDQogICAgICAgICBldmlkZW5jZSA9IGZjdF9yZWxldmVsKGV2aWRlbmNlLCAiTm8gZXZpZGVuY2UiLCBhZnRlciA9IEluZikpICU+JSANCiAgZ3JvdXBfYnkoZXZpZGVuY2UpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShgJV9iZW5lZmljaWFyaWVzYCA9IHJvdW5kKGJlbmVmaWNpYXJpZXMgLyBzdW0oYmVuZWZpY2lhcmllcykgKiAxMDAsIGRpZ2l0cyA9IDIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIkV2aWRlbmNlIG9mIGZvb2QgaW5zZWN1cml0eSBzdGF0dXMgaW4gUTEgJiBRMiAyMDIyIiwgDQogICAgICAgIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFKQ0KYGBgDQoNCjxicj4NCg0KVGhlIGdlbmVyYWwgbGFjayBvZiBldmlkZW5jZSBvZiBldmlkZW5jZSBvZiBiZW5lZmljaWFyaWVzJyBmb29kIGluc2VjdXJpdHkgc3RhdHVzIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBqdXN0aWZ5IHRvIGFmZmVjdGVkIGNvbW11bml0aWVzIGFuZCBkb25vcnMgdGhhdCB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyIGlzIHJlYWNoaW5nIHRoZSBtb3N0IGluIG5lZWQuIFRoaXMgaGlnaGxpZ2h0cyB0aGUgbmVlZCB0byBwcm9tb3RlIGEgc2hhcmVkIHVuZGVyc3RhbmRpbmcgb2YgdGhlIHJlc3BvbnNlIHRocm91Z2ggdGhlIGRldmVsb3BtZW50IG9mIGEgY29tbW9uIHByaW9yaXRpc2F0aW9uIHRvb2wgZm9yIGZvb2Qgc2VjdXJpdHkgcGFydG5lcnMuDQoNCjxicj48YnI+PGJyPg0KDQojIyMgNC4zIEJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9uDQoNCkluIHRoaXMgc2VjdGlvbiwgYSB0ZXN0IGlzIGFwcGxpZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBkaXNhZ2dyZWdhdGVkIG51bWJlcnMgb2YgYmVuZWZpY2lhcmllcyByZWFjaCBoYXZlIGJlZW4gY29waWVkIGFuZCBwYXN0ZWQgLS0gYSBzb21ld2hhdCBjb21tb24gcHJhY3RpY2UgdGhhdCBzdWxsaWVzIHRoZSBxdWFsaXR5IG9mIHRoZSBkYXRhLiBUbyBkbyB0aGlzLCB0aGUgcHJvcG9ydGlvbnMgb2YgZWFjaCBkaXNhZ2dyZWdhdGlvbiBncm91cCBieSBwYXJ0bmVyIGhhdmUgYmVlbiBjb21wYXJlZCB0byBob3cgY2xvc2UgdGhleSB3ZXJlIHRvIHRoZSBtZWFuIGZvciB0aGUgZW50aXJlIGdyb3VwLiBUbyBleHBsYWluOiBpZiBwYXJ0bmVyIEEgcmVwb3J0ZWQgdGhhdCA0MCUgb2YgYmVuZWZpY2lhcmllcyBpbiBhbiBhY3Rpdml0eSB3ZXJlIGFkdWx0IGZlbWFsZXMsIHRoaXMgcGVyY2VudGFnZSB3YXMgdGhlbiBjb21wYXJlZCB0byB0aGUgYXZlcmFnZSBwZXJjZW50YWdlIG9mIGFkdWx0IGZlbWFsZXMgZm9yIGFsbCBvdGhlciBhY3Rpdml0aWVzIHJlcG9ydGVkIGJ5IHRoYXQgcGFydG5lci4gVGhpcyBtZWFzdXJlIHdoZXRoZXIgb3Igbm90IHRoZSBzYW1lIHByb3BvcnRpb25zIHdlcmUgY29waWVkIGFuZCBwYXN0ZWQgdGhyb3VnaG91dCB0aGUgNVcgZm9ybS4NCg0KSXQgaXMgZXh0cmVtZWx5IHVubGlrZWx5IHRoYXQgdGhlc2UgcGVyY2VudGFnZXMgd291bGQgYmUgc2ltaWxhciBhY3Jvc3MgYWN0aXZpdGllcyBhcyBpbXBsZW1lbnRpbmcgcGFydG5lcnMgd29ya2VkIGluIGFuIGF2ZXJhZ2Ugb2YgYHIgcm91bmQoZnNjICU+JSBncm91cF9ieShvcmdfY29kZSkgJT4lIHN1bW1hcmlzZShsb2NhdGlvbnMgPSBuX2Rpc3RpbmN0KGxvY2F0aW9uKSkgJT4lIHttZWFuKC4kbG9jYXRpb25zKX0sIGRpZ2l0cyA9IDIpYCBsb2NhdGlvbnMuDQoNCkluIHRoZSBwbG90IGJlbG93LCB0aGUgY2xvc2VyIGEgdmFsdWUgaXMgdG8gMCUgb24gdGhlIHgtYXhpcywgdGhlIG1vcmUgbGlrZWx5IGl0IGlzIHRoYXQgaXQgd2FzIGNvcGllZCBhbmQgcGFzdGVkLiBJdCBpcyBlc3RpbWF0ZWQgdGhhdCA3MyUgb2YgYmVuZWZpY2lhcnkgZGlzYWdncmVnYXRpb24gdmFsdWVzIHdlcmUgY29waWVkIGFuZCBwYXN0ZWQuDQoNCjxicj4NCg0KYGBge3J9DQpmc2NfZGlzYWdnIDwtIGZzYyAlPiUgDQogIHBpdm90X2xvbmdlcihjb2xzID0gYyhjaGlsZF9tYWxlOmVsZGVybHlfZmVtYWxlKSwgbmFtZXNfdG8gPSAiZGlzYWdnIiwgdmFsdWVzX3RvID0gImJlbl9zdWIiKSAlPiUgDQogIGxlZnRfam9pbih0cmliYmxlKA0KICAgIH5hZ2UsIH5zZXgsIH5kaXNhZ2csIH52YWx1ZSwgDQogICAgImNoaWxkIiwgIm1hbGUiLCAiY2hpbGRfbWFsZSIsIDAuMTYyOTg5OTg5LA0KICAgICJjaGlsZCIsICJmZW1hbGUiLCAiY2hpbGRfZmVtYWxlIiwgMC4xNTg5MDA4ODMsDQogICAgImFkdWx0IiwgIm1hbGUiLCAiYWR1bHRfbWFsZSIsIDAuMjcxNDUwODMxLA0KICAgICJhZHVsdCIsICJmZW1hbGUiLCAiYWR1bHRfZmVtYWxlIiwgMC4zMDA0NDQ1ODUsDQogICAgImVsZGVybHkiLCAibWFsZSIsICJlbGRlcmx5X21hbGUiLCAwLjA0NDAyOTQyMywNCiAgICAiZWxkZXJseSIsICJmZW1hbGUiLCAiZWxkZXJseV9mZW1hbGUiLCAwLjA2MjE4NDI5DQogICAgKSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChkaXNhZ2csIGNlbnN1c19wcm9wID0gdmFsdWUpLCBieSA9ICJkaXNhZ2ciKSAlPiUNCiAgZmlsdGVyKGJlbl9zdWIgIT0gMCkgJT4lIA0KICBtdXRhdGUoYmVuX3Byb3AgPSBiZW5fc3ViIC8gYmVuZWZpY2lhcmllcywgDQogICAgICAgICBiZW5fcHJvcF9jb21wYXJlID0gYWJzKGNlbnN1c19wcm9wIC0gYmVuX3Byb3ApIC8gY2Vuc3VzX3Byb3AsDQogICAgICAgICBzYW1lX2FzX2NlbnN1cyA9IGlmZWxzZShiZW5fcHJvcF9jb21wYXJlIDwgMC4wNSwgImJhY2tmaWxsZWQiLCAicmVhbCIpKQ0KDQpmc2NfZGlzYWdnX3ZhbHVlcyA8LSBmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBncm91cF9ieShzYW1lX2FzX2NlbnN1cykgJT4lIA0KICBzdW1tYXJpc2UoYmVuX3N1YiA9IHN1bShiZW5fc3ViKSkgJT4lIA0KICBhZG9ybl9wZXJjZW50YWdlcygiY29sIikgJT4lICANCiAgbXV0YXRlKGJlbl9zdWIgPSByb3VuZChiZW5fc3ViICogMTAwLCBkaWdpdHMgPSAyKSkNCmBgYA0KDQpgYGB7ciBkaXNhZ2ctaGlzdG9ncmFtfQ0KZnNjX2Rpc2FnZyAlPiUgDQogIGZpbHRlcihuZXdfYmVuZWZpY2lhcmllcyA+IDApICU+JSANCiAgbXV0YXRlKHBjX2Rpc2FnZyA9IGJlbl9zdWIgLyBiZW5lZmljaWFyaWVzKSAlPiUgDQogIGdyb3VwX2J5KG9yZ19jb2RlLCBkaXNhZ2cpICU+JSANCiAgbXV0YXRlKG1lYW4gPSBtZWFuKHBjX2Rpc2FnZyksIA0KICAgICAgICAgICAgc2QgPSBzZChwY19kaXNhZ2csIG5hLnJtID0gVFJVRSksDQogICAgICAgICAgICBiZW5fc3ViID0gc3VtKGJlbl9zdWIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgbXV0YXRlKGNhdCA9IGlmZWxzZShzZCA+PSAuMDUsICJyZWFsIiwgImZha2UiKSwgDQogICAgICAgICBjYXQgPSBpZmVsc2UoaXMubmEoY2F0KSwgInJlYWwiLCBjYXQpKSAlPiUgDQogICMgZ3JvdXBfYnkoY2F0KSAlPiUgDQogICMgc3VtbWFyaXNlX2F0KCJuZXdfYmVuZWZpY2lhcmllcyIsIHN1bSkgJT4lIA0KICAjIG11dGF0ZShwYyAgPSBuZXdfYmVuZWZpY2lhcmllcyAvIHN1bShuZXdfYmVuZWZpY2lhcmllcykpDQogIGZpbHRlcihzZCA8PSAxKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHNkKSkgKyANCiAgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGggPSAuMDIpICsgDQogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IC4wNSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSksIA0KICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gc2VxKDAsIDEsIGJ5ID0gLjIpKSArDQogIGxhYnMoeCA9ICJQZXJjZW50YWdlIGRpZmZlcmVuY2UgZnJvbSBncm91cCBtZWFuIiwgDQogICAgICAgdGl0bGUgPSAiSGlzdG9ncmFtIG9mIHN0YW5kYXJkIGRldmlhdGlvbnMgYWNyb3NzIGJlbmVmaWNpYXJ5IGRpc2FnZ3JlZ2F0aW9ucyIsIA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSBsb3dlciB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uLCB0aGUgbW9yZSBsaWtlbHkgdGhlIHZhbHVlIGlzIHRvIGJlIGNvcHkvcGFzdGVkLlxuQ3V0LW9mZiBpcyB0aGUgcmVkIGxpbmUuIikgDQoNCmBgYA0KDQo8YnI+DQoNCk9uY2UgdGhlIGNvcHktcGFzdGVkIHZhbHVlcyBhcmUgcmVtb3ZlZCwgdGhpcyBpcyB0aGUgYnJlYWtkb3duIG9mIGJlbmVmaWNpYXJpZXMgYnkgZGlzYWdncmVnYXRpb24gZ3JvdXA6DQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1kaXNhZ2d9DQpmc2NfZGlzYWdnICU+JSANCiAgZmlsdGVyKG5ld19iZW5lZmljaWFyaWVzID4gMCkgJT4lIA0KICBtdXRhdGUocGNfZGlzYWdnID0gYmVuX3N1YiAvIGJlbmVmaWNpYXJpZXMpICU+JSANCiAgZ3JvdXBfYnkob3JnX2NvZGUsIGRpc2FnZykgJT4lIA0KICBtdXRhdGUobWVhbiA9IG1lYW4ocGNfZGlzYWdnKSwgDQogICAgICAgICAgICBzZCA9IHNkKHBjX2Rpc2FnZywgbmEucm0gPSBUUlVFKSwNCiAgICAgICAgICAgIGJlbl9zdWIgPSBzdW0oYmVuX3N1YiwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICBtdXRhdGUoY2F0ID0gaWZlbHNlKHNkID49IC4wNSwgInJlYWwiLCAiZmFrZSIpLCANCiAgICAgICAgIGNhdCA9IGlmZWxzZShpcy5uYShjYXQpLCAicmVhbCIsIGNhdCkpICU+JSANCiAgdW5ncm91cCgpICU+JQ0KICBmaWx0ZXIoY2F0ID09ICJyZWFsIikgJT4lIA0KICBncm91cF9ieShkaXNhZ2cpICU+JSANCiAgc3VtbWFyaXNlKGJlbl9zdWIgPSBzdW0oYmVuX3N1YikpICU+JSANCiAgbXV0YXRlKHBjID0gYmVuX3N1YiAvIHN1bShiZW5fc3ViKSwgDQogICAgICAgICBkaXNhZ2cgPSBmY3RfcmVsZXZlbChkaXNhZ2csIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYygiY2hpbGRfbWFsZSIsICJjaGlsZF9mZW1hbGUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFkdWx0X21hbGUiLCAiYWR1bHRfZmVtYWxlIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbGRlcmx5X21hbGUiLCAiZWxkZXJseV9mZW1hbGUiKSkpICU+JQ0KICBnZ3Bsb3QoYWVzKHggPSBkaXNhZ2csIHkgPSBwYywgZmlsbCA9IGRpc2FnZykpICsgDQogIGdlb21fY29sKCkgKyANCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbCA9IHBlcmNlbnQocGMsIGFjY3VyYWN5ID0gLjEpKSwgdmp1c3QgPSAtLjEpICsgDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBwZXJjZW50X2Zvcm1hdChhY2N1cmFjeSA9IDEpKSArIA0KICBsYWJzKHggPSAiRGlzYWdncmVnYXRpb24gZ3JvdXAiLCANCiAgICAgICB5ID0gIlBlcmNlbnRhZ2Ugb2YgYWxsIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICB0aXRsZSA9ICJBZ2UgYW5kIHNleCBvZiByZWFjaGVkIGJlbmVmaWNpYXJpZXMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJPbmx5ICdyZWFsJyB2YWx1ZXMgaW5jbHVkZWQiKSArIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDUuIFBhcnRuZXJzDQoNCiMjIyA1LjEgSW1wbGVtZW50aW5nIHBhcnRuZXINCg0KVGhlcmUgYXJlIGByIGZzYyAlPiUgZmlsdGVyKHF1YXJ0ZXIgPT0gInEyIikgJT4lIGRpc3RpbmN0KG9yZ19jb2RlKSAlPiUgbnJvdygpYCBwYXJ0bmVycyB0aGF0IHdlcmUgaW52b2x2ZWQgaW4gZGlyZWN0IGltcGxlbWVudGF0aW9uIHRoYXQgaGF2ZSByZXBvcnRlZCBhY2hpZXZlbWVudHMgaW4gc2Vjb25kIHF1YXJ0ZXIgb2YgMjAyMiwgaW4gY29tcGFyaXNvbiB3aXRoIGByIGZzYyAlPiUgZmlsdGVyKHF1YXJ0ZXIgPT0gInExIikgJT4lIGRpc3RpbmN0KG9yZ19jb2RlKSAlPiUgbnJvdygpYGluIHRoZSBmaXJzdCBxdWFydGVyLiBUaGVzZSBpbXBsZW1lbnRpbmcgcGFydG5lcnMgY29ycmVzcG9uZGVkIHRvIGEgdG90YWwgb2YgYHIgZnNjICU+JSAgZGlzdGluY3QocmVwb3J0X29yZ19jb2RlKSAlPiUgbnJvdygpYCByZXBvcnRpbmcgb3JnYW5pc2F0aW9ucy4gVGhlIGxhcmdlc3QgcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbiwgMjY5MCwgaGFkIDI0IGltcGxlbWVudGluZyBwYXJ0bmVycy4NCg0KPGJyPg0KDQpgYGB7ciB0YWJsZS1yZXBvcnRpbmctb3Jnc30NCmZzYyAlPiUgZ3JvdXBfYnkocmVwb3J0X29yZ19jb2RlKSAlPiUgDQogIHN1bW1hcmlzZShjb3VudCA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhjb3VudCkpICU+JSANCiAgcmVuYW1lKGltcGxlbWVudGluZ19wYXJ0bmVycyA9IGNvdW50KSAlPiUgDQogIGZpbHRlcihpbXBsZW1lbnRpbmdfcGFydG5lcnMgPiAyKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMgd2l0aCB0aGUgbW9zdCBpbXBsZW1lbnRpbmcgcGFydG5lcnMiLCANCiAgICAgICAgZm9ybWF0ID0gImh0bWwiLCANCiAgICAgICAgdGFibGUuYXR0ciA9ICJzdHlsZT0nd2lkdGg6NDUlOyciKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZ2VuZXJhbCA9ICJBbGwgb3RoZXJzIGhhZCAxIG9yIDIgaW1wbGVtZW50aW5nIHBhcnRuZXJzIiwgDQogICAgICAgICAgIGdlbmVyYWxfdGl0bGUgPSAiIikNCmBgYA0KDQo8YnI+DQoNClRoZSBpbnRlcmFjdGl2ZSBwbG90IGJlbG93IHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyBhbmQgdG93bnNoaXBzIHJlYWNoZWQgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIuDQoNCmByIGZzYyAlPiUgZ3JvdXBfYnkob3JnX2NvZGUpICU+JSBzdW1tYXJpc2UodG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpKSAlPiUgZmlsdGVyKHRvd25zaGlwcyA+IDUpICU+JSBucm93KClgIHBhcnRuZXJzICgyMSUgb2YgdGhlIHRvdGFsKSBoYXZlIGEgcHJlc2VuY2UgaW4gbW9yZSB0aGFuIDUgdG93bnNoaXBzLiBgciBmc2MgJT4lIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG5fZGlzdGluY3QoYWRtaW4zX3Bjb2RlKSkgJT4lIGZpbHRlcih0b3duc2hpcHMgPiAxMCkgJT4lIG5yb3coKWAgcGFydG5lcnMgYXJlIHByZXNlbnQgaW4gbW9yZSB0aGFuIDEwIHRvd25zaGlwcy4NCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktcGFydG5lci1zY2F0dGVyfQ0KDQojIE1lZGlhbiB2YWx1ZXMgYXJlIHggPSA1NjcxIGFuZCB5ID0gMy4gQ3VycmVudGx5IHVzaW5nIG1lYW4uIA0KcGFydG5lcl9zY2F0dGVyIDwtIGZzYyAlPiUgIA0KICBncm91cF9ieShvcmdfY29kZSkgJT4lIA0KICBzdW1tYXJpc2Uoc3RhdGVzID0gbl9kaXN0aW5jdChzdGF0ZSksIA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbl9kaXN0aW5jdChhZG1pbjNfcGNvZGUpLCANCiAgICAgICAgICAgIGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGJlbmVmaWNpYXJpZXMsIHkgPSB0b3duc2hpcHMsIA0KICAgICAgICAgICAgIHRleHQgPSBwYXN0ZTAob3JnX2NvZGUsICJcbiIsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlczogIiwgc3RhdGVzLCAiXG4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b3duc2hpcHM6ICIsIHRvd25zaGlwcywgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVuZWZpY2lhcmllczogIiwgY29tbWEoYmVuZWZpY2lhcmllcywgYWNjdXJhY3kgPSAxKSkpKSArIA0KICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSA0ODE0NS4zMywgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDQuNTU1NTU2LCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKyANCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGJlbmVmaWNpYXJpZXMpLCBhbHBoYSA9IC43KSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nIiwgbGFiZWxzID0gY29tbWEsIGJyZWFrcyA9IGMoMCwgMTAwLCAzMDAsIDEwMDAsIDMwMDAsIDEwMDAwLCAzMDAwMCwgMTAwMDAwLCAzMDAwMDApKSArDQogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBzZXEoMCwgMjUsIDUpKSArDQogIGxhYnMoeCA9ICJOdW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgdG93bnNoaXBzIiwNCiAgICAgICB0aXRsZSA9ICJQbG90IG9mIGJlbmVmaWNpYXJpZXMgYW5kIHRvd25zaGlwcyByZWFjaGVkLCBieSBpbXBsZW1lbnRpbmcgcGFydG5lciIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQ0KDQpnZ3Bsb3RseShwYXJ0bmVyX3NjYXR0ZXIsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwKSAlPiUNCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJCZW5lZmljaWFyaWVzIGFuZCB0b3duc2hpcHMgcmVhY2hlZCwgYnkgaW1wbGVtZW50aW5nIHBhcnRuZXIiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW91c2Ugb3ZlciBmb3IgZGV0YWlsczsgc2l6ZXMgaW5kaWNhdGUgYmVuZWZpY2lhcmllcyByZWFjaGVkOyByZWQgbGluZXMgYXJlIG1lYW5zIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8L3N1cD4iKSkpDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDUuMiBNb250aGx5IHByb2dyZXNzIGJ5IHBhcnRuZXINCg0KT3JnYW5pc2F0aW9ucyA2MTk3LCAyNjkwIGFuZCA1NzIyIGhhdmUgaW1wbGVtZW50ZWQgdGhlIG1ham9yaXR5IG9mIHRoZWlyIGFjdGl2aXRpZXMgaW4gdGhlIHNlY29uZCBxdWFydGVyIG9mIDIwMjIuIFRoZSB0aGljayBncmV5IGxpbmUgc2hvd3MgYW4gb3JnYW5pc2F0aW9uJ3MgcHJvZ3Jlc3MgZnJvbSBsYXN0IHllYXIuIA0KDQo8YnI+DQoNCmBgYHtyIHBhcnRuZXItcHJvZ3Jlc3MtZmFjZXQtbGluZX0NCg0KcGFydG5lcl90b3AgPC0gZnNjICU+JSANCiAgc3VtX2JlbihvcmdfY29kZSkgJT4lIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkgJT4lICBtdXRhdGUob3JnX2NvZGUgPSByZW9yZGVyKG9yZ19jb2RlLCAtYmVuZWZpY2lhcmllcykpICU+JSBwdWxsKG9yZ19jb2RlKSAlPiUgaGVhZCgxMikNCg0KbGluZV8yMDIxIDwtIGZzY18yMDIxICU+JSANCiAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUNCiAgZmlsdGVyKG9yZ19jb2RlICVpbiUgcGFydG5lcl90b3ApICU+JSANCiAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIG11dGF0ZShkYXRlID0gZGF0ZSArIHllYXJzKDEpKSAlPiUgDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KG9yZ19jb2RlKSAlPiUgDQogIGFycmFuZ2UoZGF0ZSkgJT4lIA0KICBtdXRhdGUoY3VtX2JlbiA9IGN1bXN1bShiZW5lZmljaWFyaWVzKSkNCg0KZnNjICU+JQ0KICBmaWx0ZXIob3JnX2NvZGUgJWluJSBwYXJ0bmVyX3RvcCkgJT4lDQogIHNlbGVjdChkYXRlLCBvcmdfY29kZSwgYmVuZWZpY2lhcmllcyA9IG5ld19iZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogICMgcmJpbmQoZnNjXzIwMjEgJT4lIA0KICAjICAgICAgICAgZmlsdGVyKHVuaXF1ZV9iZW5lZmljaWFyaWVzID09ICJZZXMiKSAlPiUgDQogICMgICAgICAgICBmaWx0ZXIob3JnX2NvZGUgJWluJSBwYXJ0bmVyX3RvcCkgJT4lIA0KICAjICAgICAgICAgc2VsZWN0KGRhdGUsIG9yZ19jb2RlLCBiZW5lZmljaWFyaWVzLCBsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSkgJT4lIA0KICBncm91cF9ieShsb2NhdGlvbiwgYWRtaW4zX3Bjb2RlKSAlPiUgDQogIHNsaWNlKHdoaWNoLm1heChiZW5lZmljaWFyaWVzKSkgJT4lIA0KICBncm91cF9ieShvcmdfY29kZSkgJT4lIA0KICBhcnJhbmdlKGRhdGUpICU+JSANCiAgbXV0YXRlKGN1bV9iZW4gPSBjdW1zdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZGF0ZSwgeSA9IGN1bV9iZW4pKSArDQogIGdlb21fc3RlcChkYXRhID0gbGluZV8yMDIxLCANCiAgICAgICAgICAgIGFlcyh4ID0gZGF0ZSwgDQogICAgICAgICAgICAgICAgeSA9IGN1bV9iZW4pLCANCiAgICAgICAgICAgIGNvbG91ciA9ICJncmV5IiwNCiAgICAgICAgICAgIHNpemUgPSAyLCANCiAgICAgICAgICAgIGFscGhhID0gLjQpICsgDQogIGdlb21fdmxpbmUoY29sb3VyID0gInJlZCIsIGx0eSA9IDIsIHhpbnRlcmNlcHQgPSBhcy5udW1lcmljKGFzLkRhdGUoIjIwMjItMDYtMDEiKSksIGFscGhhID0gLjUpICsNCiAgZ2VvbV92bGluZShjb2xvdXIgPSAicmVkIiwgbHR5ID0gMiwgeGludGVyY2VwdCA9IGFzLm51bWVyaWMoYXMuRGF0ZSgiMjAyMi0wMy0wMSIpKSwgYWxwaGEgPSAuNSkgKw0KICBnZW9tX3N0ZXAoc2l6ZSA9IDAuNykgKyANCiAgc2NhbGVfeF9kYXRlKGRhdGVfYnJlYWtzID0gIjEgbW9udGgiLCBkYXRlX2xhYmVscyA9ICIlYiIpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIGZhY2V0X3dyYXAofiBmY3RfcmV2KGZjdF9yZW9yZGVyKG9yZ19jb2RlLCBjdW1fYmVuLCBtYXgpKSwgc2NhbGVzID0gImZyZWVfeSIpICsNCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNSwgYW5nbGUgPSA2MCwgaGp1c3QgPSAxLCB2anVzdCA9IDEpLA0KICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gNSksDQogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLA0KICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAiIzIxMjEyMSIpLA0KICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMSkpICsgIyBzZWUgaWYgdGhpcyB3b3JrcyB3aGVuIHlvdSBrbml0LCB0aGVuIGRvIGl0IGZvciB0aGUgb3RoZXIgcGxvdHMgDQogIGxhYnMoeCA9ICJNb250aCIsIA0KICAgICAgIHkgPSAiQ3VtdWxhdGl2ZSBiZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiTW9udGhseSBwcm9ncmVzcyBvZiB0b3AgMTIgaW1wbGVtZW50aW5nIHBhcnRuZXJzLCAyMDIyIFExICYgUTIiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJGaWd1cmVzIHNob3cgY3VtdWxhdGl2ZSB1bmlxdWUgYmVuZWZpY2lhcmllczsgcHJldmlvdXMgeWVhcidzIHByb2dyZXNzIGluIGdyZXkiKSANCg0KIyBnZ3NhdmUoInBhcnRuZXJfZmFjZXRfbGluZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKSAgDQpgYGANCg0KPGJyPg0KDQpUaGUgdGFibGUgYmVsb3cgbGlzdHMgdGhlIHRvcCAxNSBwYXJ0bmVycyBieSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIDIwMjIuDQoNCjxicj4NCg0KYGBge3J9DQpmc2MgJT4lDQogIGdyb3VwX2J5KGxvY2F0aW9uLCBhZG1pbjNfcGNvZGUpICU+JSANCiAgc2xpY2Uod2hpY2gubWF4KGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogIGdyb3VwX2J5KG9yZ19jb2RlLCBxdWFydGVyKSAlPiUgDQogIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUNCiAgcGl2b3Rfd2lkZXIobmFtZXNfZnJvbSA9IHF1YXJ0ZXIsIHZhbHVlc19mcm9tID0gYmVuZWZpY2lhcmllcywgbmFtZXNfcHJlZml4ID0gImJlbl8iKSAlPiUgDQogIHJvd3dpc2UoKSAlPiUgDQogIG11dGF0ZSh0b3RhbF9iZW4gPSBzdW0oYmVuX3ExLCBiZW5fcTIsIG5hLnJtID0gVFJVRSkpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgbXV0YXRlKHJhbmtfcTEgPSBkZW5zZV9yYW5rKC1iZW5fcTEpLCANCiAgICAgICAgIHJhbmtfcTIgPSBkZW5zZV9yYW5rKC1iZW5fcTIpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyh0b3RhbF9iZW4pKSAlPiUgDQogIHNlbGVjdChvcmdfY29kZSwgYmVuX3ExLCByYW5rX3ExLCBiZW5fcTIsIHJhbmtfcTIsIHRvdGFsX2JlbikgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIGltcGxlbWVudGluZyBwYXJ0bmVycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMiAoUTEgJiBRMikiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpIA0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA1LjMgRG9ub3JzDQoNClRoZSB0YWJsZSBiZWxvdyBzdW1tYXJpc2VzIHRoZSByZWFjaCBhbmQgc2NvcGUgKGluIHRlcm1zIG9mIGdlb2dyYXBoaWMgZXh0ZW50IGFuZCBudW1iZXIgb2Ygb3JnYW5pc2F0aW9ucyBzdXBwb3J0ZWQpIG9mIGRvbm9ycyB3aG8gc3VwcG9ydCBhdCBsZWFzdCB0d28gcmVwb3J0aW5nIG9yZ2FuaXNhdGlvbnMuIEZDRE8gYW5kIExJRlQgc3VwcG9ydCB0aGUgbW9zdCBleHBhbnNpdmUgcHJvZ3JhbW1lcy4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGRvbm9yKSAlPiUgDQogIHN1bW1hcmlzZShyZXBvcnRfb3JncyA9IG5fZGlzdGluY3QocmVwb3J0X29yZ19jb2RlKSwgDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfb3JncyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpLCANCiAgICAgICAgICAgIHN0YXRlcyA9IG5fZGlzdGluY3QoYWRtaW4xX3Bjb2RlKSwgDQogICAgICAgICAgICB0b3duc2hpcHMgPSBuX2Rpc3RpbmN0KGFkbWluM19wY29kZSkpICU+JSANCiAgZmlsdGVyKCFpcy5uYShkb25vcikgJiByZXBvcnRfb3JncyA+IDEpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlcG9ydF9vcmdzKSkgJT4lDQogIGhlYWQoMTUpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJPcmdhbmlzYXRpb25zIHN1cHBvcnRlZCBhbmQgZ2VvZ3JhcGhpYyByZWFjaCBieSBkb25vciIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkgJT4lIA0KICBmb290bm90ZShnZW5lcmFsID0gIk9ubHkgc2hvd2luZyBkb25vcnMgc3VwcG9ydGluZyBtb3JlIHRoYW4gb25lIHJlcG9ydGluZyBwYXJ0bmVyLiIsIA0KICAgICAgICAgICBnZW5lcmFsX3RpdGxlID0gIiIpDQogDQpgYGANCg0KPGJyPg0KDQpTYWdhaW5nLCBTaGFuIChFYXN0KSBhbmQgQXlleWFyd2FkeSBoYXZlIHRoZSBmZXdlc3QgbnVtYmVyIG9mIGRvbm9ycyBwcmVzZW50Lg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWRvbm9yLXN0YXRlc30NCmZzYyAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShkb25vcnMgPSBuX2Rpc3RpbmN0KGRvbm9yKSwgDQogICAgICAgICAgICBpbXBsZW1lbnRpbmdfcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZG9ub3JzKSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIk51bWJlciBvZiBkb25vcnMgYnkgc3RhdGUiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpIA0KDQpgYGANCg0KPGJyPg0KDQpIb3dldmVyLCBhcyBzaG93biBieSB0aGUgdGFibGUgYmVsb3csIGV2ZW4gdGhvdWdoIHRoZSBtYWpvcml0eSBvZiBwYXJ0bmVycyByZXBvcnRlZCB0aGVpciBkb25vcnMsIHRoZSBvbWlzc2lvbiBvZiBkYXRhIGZyb20gdGhyZWUga2V5IHBhcnRuZXJzIGhhcyByZXN1bHRlZCBpbiB0aGUgdmFzdCBtYWpvcml0eSBvZiByZXBvcnRlZCBiZW5lZmljaWFyaWVzIG5vdCBiZWluZyBhc3NvY2lhdGVkIHdpdGggYW55IGRvbm9yLg0KDQo8YnI+DQoNCmBgYHtyIHRhYmxlLWRvbm9ycy1iZW5lZmljaWFyaWVzfQ0KZnNjICU+JSANCiAgZ3JvdXBfYnkoZG9ub3IpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpKSAlPiUgDQogIG11dGF0ZShkb25vciA9IGlmZWxzZShpcy5uYShkb25vciksICJObyBkb25vciBzcGVjaWZpZWQiLCBkb25vciksIA0KICAgICAgICAgZG9ub3IgPSBpZmVsc2UoYmVuZWZpY2lhcmllcyA8IDEwMDAsICJPdGhlciBkb25vcnMiLCBkb25vcikpICU+JSANCiAgZ3JvdXBfYnkoZG9ub3IpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgbXV0YXRlKGAlX2JlbmVmaWNpYXJpZXNgID0gcm91bmQoYmVuZWZpY2lhcmllcyAvIHN1bShiZW5lZmljaWFyaWVzKSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgYXJyYW5nZShkZXNjKGAlX2JlbmVmaWNpYXJpZXNgKSkgJT4lIA0KICBoZWFkKDE1KSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiVG9wIGRvbm9ycyBieSBiZW5lZmljaWFyaWVzIHJlYWNoZWQiLCANCiAgICAgICAgZm9ybWF0LmFyZ3MgPSBsaXN0KGJpZy5tYXJrID0gIiwiKSkgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpDQogDQpgYGANCg0KPGJyPg0KDQpCZWxvdyBpcyBhIHRhYmxlIG9mIGJlbmVmaWNpYXJpZXMgd2hvIGFyZSBtaXNzaW5nIGRvbm9ycywgZ3JvdXBlZCBieSBzdGF0ZS4NCg0KPGJyPg0KDQpgYGB7ciBtaXNzaW5nLWRvbm9yfQ0KZnNjICU+JSANCiAgZmlsdGVyKGlzLm5hKGRvbm9yKSkgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksIA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoYmVuZWZpY2lhcmllcykpICU+JSANCiAgZmlsdGVyKGJlbmVmaWNpYXJpZXMgPiAwKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiUmVwb3J0ZWQgYmVuZWZpY2lhcmllcyB3aXRoIG1pc3NpbmcgZG9ub3IgZGF0YSIsIA0KICAgICAgICBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIsIGZ1bGxfd2lkdGggPSBGQUxTRSkNCmBgYA0KDQo8YnI+PGJyPjxicj4NCg0KIyMgNi4gQ29tcGFyaXNvbiB3aXRoIHRhcmdldHMNCg0KIyMjIDYuMiBSZWFjaGVkIHZzIHRhcmdldCBieSB0b3duc2hpcA0KDQpUaGUgc3BlY2lmaWNzIG9mIGVhY2ggdG93bnNoaXAgY2FuIGJlIHJldmlld2VkIHdpdGggdGhlIGludGVyYWN0aXZlIHBsb3QgYmVsb3cuIEVhY2ggcG9pbnQgaXMgYSB0b3duc2hpcCwgd2l0aCB0aGUgc2l6ZSBpbmRpY2F0aW5nIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcy4gVGhlIHgtYXhpcyBpbmRpY2F0ZXMgdGhlIHRhcmdldCBwb3B1bGF0aW9uIGJ5IHRvd25zaGlwIGFuZCB0aGUgeS1heGlzIHNob3dzIHRoZSBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyByZWFjaGVkIGluIFExIGFuZCBRMiAyMDIyLg0KDQpUaGUgcmVkIGxpbmUgZG93biB0aGUgbWlkZGxlIHJlcHJlc2VudHMgcmVhY2hpbmcgMTAwJSBvZiB0aGUgdGFyZ2V0LiBUb3duc2hpcHMgYWJvdmUgdGhpcyBsaW5lIGhhdmUgcmVhY2hlZCBtb3JlIGJlbmVmaWNpYXJpZXMgdGhhbiB0aGVpciB0YXJnZXQgYW5kIHRvd25zaGlwcyBiZWxvdyB0aGUgbGluZSBoYXZlIG5vdCBtZXQgdGhlaXIgdGFyZ2V0IHlldC4gVGhlIGZ1cnRoZXIgYXdheSBhIHRvd25zaGlwIGlzIGZyb20gdGhlIHJlZCBsaW5lLCB0aGUgZnVydGhlciBhYm92ZSBvciBiZWxvdyBpdHMgdGFyZ2V0IGl0IGlzLiBNb3VzZSBvdmVyIGVhY2ggb2YgdGhlIHRvd25zaGlwcyB0byBzZWUgbW9yZSBkZXRhaWxzLg0KDQpUaGUgMTMgdG93bnNoaXBzIGFsb25nIHRoZSBleHRyZW1lIGxlZnQgc2lkZSBvZiB0aGUgcGxvdCBoYXZlIGJlbmVmaWNpYXJpZXMgYnV0IGRvIG5vdCBoYXZlIHRhcmdldHMgKHRoZWlyIHRhcmdldHMgaGF2ZSBqdXN0IGJlZW4gY29kZWQgYXMgMSBzbyB0aGF0IHRoZXkgc2hvdyB1cCBvbiB0aGUgcGxvdCkuIDIwOSB0b3duc2hpcHMgd2l0aCB0YXJnZXRzIGhhdmUgbm90IGJlZW4gcmVhY2hlZC4NCg0KPGJyPg0KDQpgYGB7ciBwbG90bHktdHNwLWNvbXBhcmlzb24tcmVhY2hlZC10YXJnZXR9DQoNCmJlbl90YXJnZXQgPC0gZnNjICU+JSANCiAgZ3JvdXBfYnkoYWRtaW4zX3Bjb2RlX29sZCkgJT4lIA0KICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShuZXdfYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICBwYXJ0bmVycyA9IG5fZGlzdGluY3Qob3JnX2NvZGUpKSAlPiUgDQogIGxlZnRfam9pbihwaW4sIGJ5ID0gYygiYWRtaW4zX3Bjb2RlX29sZCIgPSAiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIGZzX3RhcmdldGVkID0gaWZlbHNlKGZzX3RhcmdldGVkID09IDAgJiBiZW5lZmljaWFyaWVzID4gMCwgMSwgZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgZnNfdGFyZ2V0ZWQgPSByb3VuZChmc190YXJnZXRlZCwgZGlnaXRzID0gMCkpICU+JSANCiAgYXJyYW5nZShkZXNjKHJlYWNoZWRfcGMpKSAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIGZzX3BpbiwgZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsIHJlYWNoZWRfcGMsIHBhcnRuZXJzKSAlPiUNCiAgZ2dwbG90KGFlcyh4ID0gZnNfdGFyZ2V0ZWQsIHkgPSBiZW5lZmljaWFyaWVzLCBjb2xvdXIgPSBwYXJ0bmVycywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZW5lZmljaWFyaWVzOiAiLCBjb21tYShiZW5lZmljaWFyaWVzLCBhY2N1cmFjeSA9IDEpLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhcmdldDogIiwgY29tbWEoZnNfdGFyZ2V0ZWQsIGFjY3VyYWN5ID0gMSksICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiJSBvZiB0YXJnZXQ6ICIsIHBlcmNlbnQocmVhY2hlZF9wYywgYWNjdXJhY3kgPSAyKSwgIlxuIiwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAicGFydG5lcnM6ICIsIHBhcnRuZXJzKSkpICsgDQogIGdlb21fYWJsaW5lKGludGVyY2VwdCA9IDAsIHNsb3BlID0gMSwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBiZW5lZmljaWFyaWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfc2l6ZV9jb250aW51b3VzKGd1aWRlID0gIm5vbmUiKSArIA0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBsYWJlbHMgPSBjb21tYSkgKyANCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgbGFiZWxzID0gY29tbWEpICsNCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMoZGlyZWN0aW9uID0gLTEsIGJyZWFrcyA9IGMoMCwgMiwgNSwgOCwgMTApKSArDQogIGxhYnMoeCA9ICJUYXJnZXRlZCBwb3B1bGF0aW9uIiwgeSA9ICJCZW5lZmljaWFyaWVzIiwgDQogICAgICAgdGl0bGUgPSAiQmVuZWZpY2lhcmllcyByZWFjaGVkIHZzIHRhcmdldGVkIHBvcHVsYXRpb24gYnkgdG93bnNoaXAsIFExIDIwMjIiLA0KICAgICAgIHN1YnRpdGxlID0gIlRoZSByZWQgbGluZSBpcyAxMDAlIG9mIHRhcmdldCIpICsgDQogIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gNykpDQoNCmdncGxvdGx5KGJlbl90YXJnZXQsIHRvb2x0aXAgPSBjKCJ0ZXh0IiksIHdpZHRoID0gODIwLCBoZWlnaHQgPSA1MDApICU+JSANCiAgY29uZmlnKGRpc3BsYXlNb2RlQmFyID0gRkFMU0UpICU+JSANCiAgbGF5b3V0KHRpdGxlID0gbGlzdCh0ZXh0ID0gcGFzdGUwKCJCZW5lZmljaWFyaWVzIHJlYWNoZWQgdnMgdGFyZ2V0ZWQgcG9wdWxhdGlvbiBieSB0b3duc2hpcCwgUTEgJiBRMiAyMDIyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8YnI+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8c3VwPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlIHJlZCBsaW5lIGlzIDEwMCUgb2YgdGFyZ2V0OyBzaXplIGluZGljYXRlcyBudW1iZXIgb2YgYmVuZWZpY2lhcmllcyIsIjwvc3VwPiIpKSwgDQogICAgICAgICBsZWdlbmQgPSBsaXN0KGZvbnQgPSBsaXN0KHNpemUgPSA3KSkpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNi4yIE1hcCBvZiBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gUTEgJiBRMiAyMDIyIHZzIHRhcmdldA0KDQpgYGB7ciBtYXBzLWJlbi10YXJnZXQsIGZpZy5oZWlnaHQ9OX0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZSA9IGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0oYmVuZWZpY2lhcmllcykpICU+JSANCiAgcmlnaHRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gYygiYWRtaW4zX3Bjb2RlIikpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGJlbmVmaWNpYXJpZXMpLCBzaXplID0gMC4xKSArDQogIHNjYWxlX2ZpbGxfdmlyaWRpc19jKGRpcmVjdGlvbiA9IC0xLCB0cmFucyA9ICJsb2cxMCIsIA0KICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDEwMCwgMTAwMCwgMTAwMDAsIDEwMDAwMCwgNTAwMDAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gY29tbWEsIA0KICAgICAgICAgICAgICAgICAgICAgICBuYS52YWx1ZSA9ICJncmF5OTAiKSArIA0KICB0aGVtZV92b2lkKCkgKw0KICB0aGVtZShsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApLA0KICAgICAgICBsZWdlbmQudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEwKSwNCiAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICBsYWJzKHRpdGxlID0gIkJlbmVmaWNpYXJpZXMgYnkgdG93bnNoaXAsIFExICYgUTIgMjAyMiIsDQogICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGhhdmUgYW55IHBhcnRuZXJzIHByZXNlbnQiLCANCiAgICAgICBmaWxsID0gIkJlbmVmaWNpYXJpZXMiKSArDQoNCiMgZ2dzYXZlKCJiZW5lZmljaWFyaWVzX2J5X3RzcC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDE4LCB3aWR0aCA9IDExLCB1bml0cyA9ICJpbiIpDQoNCnBpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lICANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGZzX3RhcmdldGVkKSwgc2l6ZSA9IC4xKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhkaXJlY3Rpb24gPSAtMSwgdHJhbnMgPSAibG9nMTAiLCAgDQogICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTAwLCAxMDAwLCAxMDAwMCwgMTAwMDAwLCA1MDAwMDApLA0KICAgICAgICAgICAgICAgICAgICAgICBsaW1pdHMgPSByYW5nZSg1NywgODAxNzYwKSwgDQogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGNvbW1hLCANCiAgICAgICAgICAgICAgICAgICAgICAgbmEudmFsdWUgPSAiZ3JheTkwIikgKyANCiAgdGhlbWVfdm9pZCgpICsgDQogIHRoZW1lKGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMCksDQogICAgICAgICAgbGVnZW5kLmtleS5zaXplID0gdW5pdCgwLjcsICdjbScpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSAid2hpdGUiKSkgKw0KICAgIGxhYnModGl0bGUgPSAiMjAyMiB0YXJnZXQgYnkgdG93bnNoaXAiLA0KICAgICAgICAgc3VidGl0bGUgPSAidG93bnNoaXBzIGluIGdyZXkgZG8gbm90IGZvb2Qgc2VjdXJpdHkgdGFyZ2V0cyIsIA0KICAgICAgICAgZmlsbCA9ICJ0YXJnZXQiKQ0KDQojIGdnc2F2ZSgidGFyZ2V0X2J5X3RzcC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDE4LCB3aWR0aCA9IDExLCB1bml0cyA9ICJpbiIpDQoNCg0KDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIyA2LjMgSW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlDQoNClRoZXJlIHdhcyBhbiBvdmVyYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMgaW4gdGhlc2UgcmVsYXRpdmVseSBmZXcgYXJlYXMgaW4gMjAyMSBhbmQgdGhpcyBoYXMgY29udGludWVkIGluIHRoZSBmaXJzdCBxdWFydGVyIG9mIDIwMjIuIEluIHRoZSBpbnRlcmFjdGl2ZSB0YWJsZSBiZWxvdywgaXMgYSBsaXN0IG9mIHRvd25zaGlwcyBzb3J0ZWQgYnkgdGhlIGdhcCBiZXR3ZWVuIHRoZSB0YXJnZXRlZCBwb3B1bGF0aW9uIGFuZCBiZW5lZmljaWFyaWVzIHJlYWNoZWQgaW4gMjAyMi4gQW55IG9mIHRoZSBjb2x1bW5zIGNhbiBiZSBzb3J0OyB0aGUgc2VhcmNoIGJhcnMgYWJvdmUgZWFjaCBjb2x1bW4gY2FuIGFsc28gYXNzaXN0IGluIGZpbHRlcmluZy4NCg0KPGJyPg0KDQpgYGB7cn0NCmZzYyAlPiUgDQogIGdyb3VwX2J5KGFkbWluM19wY29kZV9vbGQpICU+JSANCiAgc3VtbWFyaXNlKGJlbmVmaWNpYXJpZXMgPSBzdW0obmV3X2JlbmVmaWNpYXJpZXMpLA0KICAgICAgICAgICAgcGFydG5lcnMgPSBuX2Rpc3RpbmN0KG9yZ19jb2RlKSkgJT4lIA0KICByaWdodF9qb2luKHBpbiwgYnkgPSBjKCJhZG1pbjNfcGNvZGVfb2xkIiA9ICJhZG1pbjNfcGNvZGUiKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoYmVuZWZpY2lhcmllcyA9IDApKSAlPiUNCiAgbXV0YXRlKHJlYWNoZWRfcGMgPSBiZW5lZmljaWFyaWVzIC8gZnNfdGFyZ2V0ZWQsDQogICAgICAgICByZWFjaGVkX3BjID0gaWZlbHNlKGlzLmluZmluaXRlKHJlYWNoZWRfcGMpLCAxLCByZWFjaGVkX3BjKSwNCiAgICAgICAgIHJlYWNoZWRfcGMgPSByb3VuZChyZWFjaGVkX3BjICogMTAwLCBkaWdpdHMgPSAyKSwgDQogICAgICAgICBmc190YXJnZXRlZCA9IHJvdW5kKGZzX3RhcmdldGVkLCBkaWdpdHMgPSAwKSwgDQogICAgICAgICBvdmVycmVhY2ggPSBiZW5lZmljaWFyaWVzIC0gZnNfdGFyZ2V0ZWQpICU+JSANCiAgYXJyYW5nZShkZXNjKG92ZXJyZWFjaCkpICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgdGFyZ2V0ID0gZnNfdGFyZ2V0ZWQsIGJlbmVmaWNpYXJpZXMsIG92ZXJyZWFjaCwgYCVfcmVhY2hlZGAgPSByZWFjaGVkX3BjLCBwYXJ0bmVycykgJT4lIA0KICBkYXRhdGFibGUob3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDE1LCBzY3JvbGxYID0gVFJVRSksIA0KICAgICAgICAgICAgZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICdjYXB0aW9uLXNpZGU6IHRvcDsgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6YmxhY2s7IGZvbnQtc2l6ZToxMjAlIDsnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJlZmVyZW5jZSB0YWJsZSAtLSB0b3duc2hpcHMiKSkgJT4lIA0KICBmb3JtYXRSb3VuZChjKCJ0YXJnZXQiLCAiYmVuZWZpY2lhcmllcyIsICJvdmVycmVhY2giKSwgZGlnaXRzID0gMCkgJT4lIA0KICBmb3JtYXRTdHlsZSgwLCB0YXJnZXQgPSAicm93IiwgbGluZUhlaWdodCA9ICI4MCUiLCBmb250U2l6ZSA9ICI4MCUiKQ0KDQoNCg0KYGBgDQo=